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

给出错误(在 Firefox 和 Chrome 的控制台上测试)。这是 JSON.parse 的错误吗?使用 PHP 测试时,相同的解码效果很好。

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

5 回答 5

12

这个字符串在 PHP 和 JS 中的处理方式不同,即你得到不同的结果。

PHP 中单引号字符串中唯一的转义序列是\\\'。根据文档,所有其他内容都按字面意思输出:

要指定文字单引号,请使用反斜杠 ( \) 对其进行转义。要指定文字反斜杠,请将其加倍 ( \\)。所有其他反斜杠实例将被视为文字反斜杠:这意味着您可能习惯的其他转义序列,例如\ror \n,将按指定的字面输出而不是具有任何特殊含义。

另一方面,在 JS 中,如果字符串包含无效的转义序列,则反斜杠将被丢弃CV表示字符值):

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

引用本身可能没有帮助,但如果您点击链接并查看语法,它应该会变得清晰。


因此,在 PHP 中,字符串实际上会包含\",而在 JS 中,它只会包含",这使得 JSON 无效:

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

如果要在 JS 中创建文字反斜杠,则必须对其进行转义:

'{"data":"{\\"json\\":\\"rocks\\"}"}'
于 2012-09-29T19:08:10.540 回答
4

要在字符串文字中有文字反斜杠,您需要\\.

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

这将成功地转义 JSON 处理的内部引号。

于 2012-09-29T18:56:04.183 回答
3

您需要转义反斜杠:

console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}'));​
于 2012-09-29T18:56:13.253 回答
2

带有一个或多个'\' 的对象不会通过JSON.parser返回 Object ,它将再次返回字符串并跳过一个'\'。您可以一次又一次地进行解析,直到跳过所有“\” 。

myobj = {\"json\":\"rocks\"}

myobj = {\\"json\\":\\"rocks\\"}

以下几行对我有用

删除反斜杠

while(typeof myobj == 'string'){
       myobj = JSON.parse(myobj)
}
于 2017-07-22T14:40:29.687 回答
1

您实际上并不需要在单引号内转义双引号,并且您在内部对象周围的输入中有两个额外的引号,只是

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

足够。

于 2012-09-29T19:33:20.993 回答