console.log(JSON.parse('{"data":"{\"json\":\"rocks\"}"}'));
给出错误(在Firefox和Chrome的控制台上测试)。这是JSON.parse的错误吗?使用PHP测试时,相同的解码很好。
print_r(json_decode('{"data":"{\"json\":\"rocks\"}"}', true));
答案 0 :(得分:10)
这个字符串在PHP和JS中的处理方式不同,即你会得到不同的结果。
PHP中单引号字符串中唯一的转义序列是\\
和\'
。根据{{3}}:
要指定文字单引号,请使用反斜杠(
\
)对其进行转义。要指定文字反斜杠,请将其加倍(\\
)。反斜杠的所有其他实例将被视为文字反斜杠:这意味着您可能习惯使用的其他转义序列(例如\r
或\n
)将按字母顺序输出,而不是任何特殊意义。
另一方面,在JS中,如果字符串包含无效的转义序列,documentation(CV
表示字符值):
- CharacterEscapeSequence :: NonEscapeCharacter 的CV是 NonEscapeCharacter 的CV。
- NonEscapeCharacter :: SourceCharacter 的CV,但 EscapeCharacter 或 LineTerminator 的CV是 SourceCharacter 字符本身。< / LI>
引用本身可能没什么用处,但是如果你按照链接查看语法,它就会变得清晰。
因此在PHP中字符串将包含\"
,而在JS中它只包含"
,这使得它无效JSON:
{"data":"{"json":"rocks"}"}
如果你想在JS中创建一个文字反斜杠,你必须逃避它:
'{"data":"{\\"json\\":\\"rocks\\"}"}'
答案 1 :(得分:4)
要在字符串文字中使用文字反斜杠,您需要\\
。
console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}'));
这将成功转义JSON处理的内部引号。
答案 2 :(得分:3)
你需要逃避反斜杠:
console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}'));
答案 3 :(得分:1)
你真的不需要在单引号内转义双引号,你在内部对象的输入中有两个额外的引号,只是
console.log(JSON.parse('{"data":{"json":"rocks"}}'));
就够了。
答案 4 :(得分:1)
具有一个或多个&#39; <&#39; 的对象不会通过 JSON.parser 返回Object,它将再次返回字符串并跳过一个<强>&#39; \&#39; 即可。 您可以反复解析,直到跳过所有&#39; <&#39; 。
myobj = {\&#34; json \&#34;:\&#34; rocks \&#34;}
myobj = {\\&#34; json \\&#34;:\\&#34; rocks \\&#34;}
以下线为我工作
删除反斜杠
while(typeof myobj == 'string'){
myobj = JSON.parse(myobj)
}