使用jQuery.parseJSON的JSON解析错误

时间:2010-11-19 14:32:21

标签: javascript jquery json

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

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

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

4 个答案:

答案 0 :(得分:4)

不,但null是。 RFC 4627 §2.1

  

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

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

答案 1 :(得分:4)

如果你可以围绕这个,那么令牌 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');

唯一的控制台输出将是'no 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'会抛出异常。)

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

typeof(example.AKEY) == 'undefined'

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

他们不允许使用JSON ......看看替代方案,并明确原因:

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

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