为什么JSON标准中的字符串中不允许使用双引号和反斜杠?

Dan*_*ert 6 javascript json

如果我在Chrome或Firebug中的JavaScript控制台中运行它,它可以正常工作.

JSON.parse('"\u0027"') // Escaped single-quote
Run Code Online (Sandbox Code Playgroud)

但是如果我在Javascript控制台中运行这两行中的任何一行,则会引发错误.

JSON.parse('"\u0022"') // Escaped double-quote
JSON.parse('"\u005C"') // Escaped backslash
Run Code Online (Sandbox Code Playgroud)

RFC 4627第2.5节似乎意味着只要它们被正确转义,\并且"是允许的字符.然而,我尝试过的2个浏览器似乎并不允许这样做.我在这里做错了什么,或者他们真的不允许在字符串中?我也试着使用\"\\在地方\u0022\u005C分别.

我觉得我只是做了一些非常错误的事情,因为我发现很难相信JSON不会在字符串中允许这些字符,特别是因为规范似乎没有提到任何我可以找到的说他们不被允许的内容.

Poi*_*nty 8

你需要引用反斜杠!

我们称之为玫瑰的东西

任何其他名称都会闻到甜蜜

双引号是双引号,无论你如何在字符串常量中表达它.如果你\u在常量之前在表达式之前放一个反斜杠,那么效果就是反斜杠引用的双引号,这实际上是你得到的.

关于你的问题最有趣的是它帮助我意识到我写过的每个JavaScript字符串解析器都是错误的.


Ple*_*and 5

JavaScript 会在 Unicode 转义序列到达 JSON 解析器之前对其进行解释。这带来了一个问题:

  • '"\u0027"'第一次不加引号(通过 JavaScript):"'"
    第二次(通过 JSON 解析器)作为表示字符串的有效 JSON:'

  • '"\u0022"'第一次未加引号(通过 JavaScript):"""
    JSON 解析器将此未加引号的版本"""视为无效的 JSON(不需要最后一个引号)。

  • '"\u005C"'第一次不加引号(通过 JavaScript):"\"
    JSON 解析器还将这个不加引号的版本"\"视为无效的 JSON(第二个引号是反斜杠转义的,因此不会终止字符串)。

对此的解决方法是转义转义序列,因为\\u....实际上,您可能只是不使用 JSON 解析器。在正确的上下文中使用(通过将其包装在括号内来确保,所有 JSON 都是有效的 JavaScript。