2010-11-19 58 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