使用jQuery.parseJSON的JSON解析错误

此代码失败,并显示指示无效JSON的exception:

var example = '{ "AKEY": undefined }'; jQuery.parseJSON(example); 

我能够通过用空字符串替换所有未定义来修复它。 undefined不是JSON的一部分吗?

如果你可以围绕这个,那么undefined标记实际上是未定义的。

请允许我详细说明:即使JavaScript有一个名为undefined的特殊原始值, undefined 也不是JavaScript关键字,也没有任何特殊含义。 您可以通过比较undefined的对象来破坏测试对象存在的代码。

 var obj = { BKEY: 'I exist!' }; if (obj.AKEY == undefined) console.log ('no AKEY'); if (obj.BKEY == undefined) console.log ('should not happen'); undefined='uh oh'; if (obj.AKEY == undefined) console.log ('oops!'); // Logically, we want this to execute, but it will not! if (obj.BKEY == undefined) console.log ('should not happen'); 

唯一的控制台输出将是“没有AKEY”。 在我们分配给全局变量undefinedobj.AKEY == undefined变为false,因为undefined != 'uh oh'obj.BKEY == undefined仍然返回false,但这只是因为我们很幸运。 如果我设置了obj.BKEY='uh oh' ,那么obj.BKEY == undefined将是真的即使它确实存在

您可能希望明确将AKEY设置为null 。 (顺便说一句, null 一个关键字; null='uh oh'抛出exception)。

你也可以简单地从你的JSON中省略AKEY ,在这种情况下你会发现:

 typeof(example.AKEY) == 'undefined' 

(如果将AKEY设置为null ,则typeof(example.AKEY) == 'object' 。)

设置为null和省略之间唯一真正的区别是您是否希望键出现在foreach循环中。

不,但是null 。 RFC4627§2.1 :

JSON值必须是对象,数组,数字或字符串,或以下三个文字名称之一:

  false null true 
 var example = '{ "AKEY": null }'; 

正确。 未定义和函数未在JSON中表示。 http://www.json.org/js.html

它们不允许使用JSON …看看替代方案,它清楚地说明了原因:

 var example = '{}'; var obj = jQuery.parseJSON(example); obj.AKEY //undefined 

如果它undefined ,当你去访问它时,它与甚至不存在的密钥相同。 由于JSON的主要目的是传输数据(否则更广泛的对象文字语法很好)…最好完全不用它。