如果JSON解析对象不存在,如何避免脚本损坏

How to avoid broken script if JSON parse object not present?

本文关键字:何避免 脚本 损坏 不存在 JSON 对象 如果      更新时间:2023-10-11

我正在接收JSON数据,其中我正在提取对象值,如下所示:

JSON.parse(Result.Data).Obj1

当脚本被破坏时,问题就会出现,因为Obj1不存在/不包含在我接收的JSON数据中。

我试过了:

if(typeof JSON.parse(Result.Data).Obj1 ==="undefined") { do something }

也尝试过:

if( typeof(JSON.parse(Result.Data).Obj1) =="undefined") { do something }

但代码仍然被破坏,如何解决?

更新:

我使用JSON.parse的原因是,数据通常在引号之前带有反斜杠,就像{"Data":"{'"Obj1'":'"value'"}"}一样。但在另一个时间,它没有Obj1键,也没有任何反斜杠,并且会是这样的:{"Data":"value"}

但代码仍然被破坏,如何解决?

我认为问题是JSON.parse生成了一个错误,因为您传递的值不是有效的JSON。如果是这样的话,你可以选择

  • 首先检查该值,看它是否像JSON
  • 使用try...catch

检查值

根据Result.Data可能具有的值,您可以查看该值是否以字符序列{"开头。如果是,则很可能是JSON,需要对其进行解析。我假设Result.Data也将是一个字符串。

var data = Result.Data.indexOf('{"') === 0 ?
  JSON.parse(Result.Data).Obj :
  Result.Data;

捕获解析错误

或者,您可以始终尝试将值解析为JSON,但如果不是JSON,则会捕获错误:

try {
  var data = JSON.parse(Result.Data).Obj1;
  // do something with data;
} catch(error) {
  // maybe validate that `error` is a JSON.parse error
  // Result.Data is not JSON, do whatever you want to do in this case here
}

很难说你到底想做什么,然后可能会建议一种更好或更干净的方法来做,但要知道它是否已经定义,你可以只做: if (JSON.parse(Result.Data).Obj1 === undefined) { // do something }

您不能要求nullundefined上的属性,JSON.parse()可以返回该属性。

使用默认运算符来防止抛出错误:

if( (JSON.parse(Result.Data) || {} ).Obj1 ) alert( "ok" );

如果JSON无效或为空,则不会抛出。如果Result.Data是falsy,那么空对象就会出现,这样当您请求.Obj1时,它就不会异常。