2012-09-29 43 views
2
console.log(JSON.parse('{"data":"{\"json\":\"rocks\"}"}')); 

給出錯誤(Firefox和Chrome的控制檯上進行測試)。這是JSON.parse的錯誤嗎?使用PHP進行測試時,解碼效果相當好。Javascript的JSON.parse錯誤?

print_r(json_decode('{"data":"{\"json\":\"rocks\"}"}', true)); 
+0

注意:我試圖解釋問題是什麼,但看看Oleg的答案是如何構建數據。 –

+0

是的。但引述是故意的。你回答了。 – kehers

回答

10

此字符串在PHP和JS不同的處理,即你會得到不同的結果。

唯一逃脫在PHP單引號串序列\\\'。所有的人都從字面上輸出,根據documentation

要指定一個單引號,用反斜槓(\)逃脫它。要指定文字反斜槓,請將其加倍(\\)。反斜槓的所有其他實例將被視爲一個反斜槓:這意味着你可以使用其他轉義序列,如\r\n,將輸出字面上指定的,而不是任何特殊含義。

在JS,另一方面,如果字符串包含一個無效的轉義序列,the backslash is discardedCV意味着字符值):

  • CharacterEscapeSequence的CV :: NonEscapeCharacter是CV的NonEscape字符
  • NonEscapeCharacter :: SourceCharacter的CV但不EscapeCharacterLineTerminatorSourceCharacter字符本身。

的報價可能不是由自身有益的,但如果你遵循鏈接,看看語法,應該清楚。


所以在PHP中的字符串字面包含\"而JS只會包含",這使得無效的JSON:

{"data":"{"json":"rocks"}"} 

如果你想創建一個JS反斜槓,你必須逃避它:

'{"data":"{\\"json\\":\\"rocks\\"}"}' 
4

要在字符串文字中使用文字反斜線,您需要\\

console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}')); 

這將成功地逃脫了JSON處理內部引號。

3

你需要躲避反斜線:

console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}'));​ 
1

你真的不需要在單引號裏面加雙引號,並且你有兩個e在內部對象周圍輸入xtra引號,只需

console.log(JSON.parse('{"data":{"json":"rocks"}}')); 

就夠了。

+0

是的,我知道這是正確的方法。引號是故意的。 – kehers

0

對象 '\'不會通過JSON.parser

MyObj中= {\ 「JSON \」:\ 「岩石\」}解析

MyObj中= {\\「JSON \\ 「:\\」 石頭\\「}

休耕線工作對我來說

刪除反斜槓

while(typeof myobj == 'string'){ 
     myobj = JSON.parse(myobj) 
}