如果我在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不会在字符串中允许这些字符,特别是因为规范似乎没有提到任何我能找到的说他们的信息。不允许。
答案 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('"\\\\"')
按预期工作。