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

时间:2016-03-31 05:49:23

标签: javascript angularjs json

我正在接收JSON数据,我按如下方式提取对象值:

JSON.parse(Result.Data).Obj1

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

我试过了:

Obj1

还尝试过:

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

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

更新

我使用JSON.parse的原因是数据通常在引号之前用反斜杠接收,如if( typeof(JSON.parse(Result.Data).Obj1) =="undefined") { do something } 但在另一个时间它没有Obj1键而没有任何反斜杠并将是这样的:{"Data":"{\"Obj1\":\"value\"}"}

3 个答案:

答案 0 :(得分:1)

很难说出你究竟要做什么,然后或许建议一个更好或更清洁的方法去做,但要知道它是否定义你可以做到: if (JSON.parse(Result.Data).Obj1 === undefined) { // do something }

答案 1 :(得分:1)

您不能要求nullundefined上的JSON.parse()可以归还的财产。

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

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

如果JSON无效或为空,则不会抛出。 如果Result.Data是假的,那么空对象就会存在,这样当你要求.Obj1时,它就不会出错。

答案 2 :(得分:1)

  

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

我认为问题是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
}