使用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”。 在我们分配给全局变量undefined
, obj.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的主要目的是传输数据(否则更广泛的对象文字语法很好)…最好完全不用它。