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

时间:2011-01-02 02:42:25

标签: javascript json

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

JSON.parse('"\u0027"') // Escaped single-quote

但是如果我在Javascript控制台中运行这两行中的任何一行,就会抛出错误。

JSON.parse('"\u0022"') // Escaped double-quote
JSON.parse('"\u005C"') // Escaped backslash

RFC 4627 section 2.5似乎暗示\"是允许的字符,只要它们被正确转义即可。然而,我尝试过的2个浏览器似乎并不允许这样做。我在这里做错了什么,或者他们真的不允许在字符串中?我还尝试分别使用\"\\代替\u0022\u005C

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

3 个答案:

答案 0 :(得分:8)

你需要引用反斜杠!

  

我们称之为玫瑰

     

任何其他名称都会闻起来很香味

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

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

答案 1 :(得分:4)

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

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

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

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

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

答案 2 :(得分:3)

你没有转义反斜杠和双引号,因为\ u00xx正在被javascript解析器解释。

JSON.parse('"\\\u0022"')
JSON.parse('"\\\""')

JSON.parse('"\\\u005C"')
JSON.parse('"\\\\"')

按预期工作。