2010-11-19 37 views
1

此代码失败,并表示无效的JSON异常:JSON解析错误使用jQuery.parseJSON

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

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

回答

4

如果你可以围绕这一点,令牌undefined实际上是未定义的。

请允许我阐述:尽管JavaScript有所谓不确定的特殊原始值,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后,由于undefined != 'uh oh'obj.AKEY == undefined变为错误。 obj.BKEY == undefined仍然返回错误,但只是因为我们很幸运。如果我已经设置了obj.BKEY='uh oh',那么obj.BKEY == undefined将是true,即使它实际上存在

您可能想要明确地将AKEY设置为null。 (顺便说一下,null一个关键字; null='uh oh'抛出一个异常)。

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

typeof(example.AKEY) == 'undefined' 

(如果设置AKEYnull,然后typeof(example.AKEY) == 'object'。)

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

4

不,但是null是。 RFC 4627 §2.1

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

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

他们不会在JSON允许...看看另类,很明显,为什么:

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

如果是undefined,当你去访问它,这是一样的钥匙甚至不在场。由于JSON的主要目的是传输数据(否则更广泛的对象字面值语法是好的)......最好将它完全抛弃。

+0

*有*与{{AKEY:undefined}'之间的区别'。对于后者,'AKEY'将显示在''for each''枚举中。 – 2010-11-19 14:39:57

+0

@Matthew - 当你访问它时,没有什么区别......你能想到一个有效的用例,你想查看它枚举和关心,因为它没有被定义? – 2010-11-19 14:40:59

+0

没有。它绝对简化了JSON的东西只是为了空。我只是想指出,有一个区别。 – 2010-11-19 14:43:21