【问题标题】:JSON.parse parses JSON.stringify output but not string itselfJSON.parse 解析 JSON.stringify 输出但不解析字符串本身
【发布时间】:2016-09-18 08:59:58
【问题描述】:

我刚刚在 Chrome 控制台中得到了这个:

JSON.stringify(({wat:"\""}))
> "{"wat":"\""}"
JSON.parse(JSON.stringify(({wat:"\""})))
> Object {wat: """}
JSON.parse('{"wat":"\""}')
> VM34235:1 Uncaught SyntaxError: Unexpected string in JSON at position 9(…)

截图:

JSON.parse 在传递JSON.stringify({wat:"\""}) 的输出时成功解析,但在我尝试评估JSON.parse('{"wat":"\""}') 时抛出。

我在说恶作剧。

【问题讨论】:

  • 查看'{"wat":"\""}'的字符串值。那应该就很清楚了。
  • '{"wat":"\""}' === '{"wat":"""}'; // true,你需要转义你的反斜杠
  • 如果您查看控制台输出 ("{"wat":"\""}"),您可以看到该值不是有效的字符串文字,因为它不显示转义序列。否则它必须看起来像"{\"wat\":\"\\\"\"}"。因此,您不能简单地将输出复制并粘贴到字符串文字中。控制台向您显示的是字符串 value。如果您在控制台中输入'foo\nbar',这可能会变得更加明显。
  • 是的,我应该知道的。我正在调试一些将字符串化对象放入模板字符串中的代码,该字符串稍后会被评估,并尝试解析相同的内容,让我很困惑以至于忘记了正确的转义......

标签: javascript json parsing


【解决方案1】:

尝试像这样添加 2 个反斜杠。 JS 将 \ 视为转义字符并忽略它。所以:

{wat:"\\""}

【讨论】:

    【解决方案2】:

    引号字符必须用两个反斜杠转义,如下所示:

    JSON.parse('{"wat":"\\""}')
    

    当它只用一个反斜杠转义时,JSON.parse() 实际上得到以下值来解析:

    {"wat":"""}
    

    这当然是无效的 JSON。

    【讨论】:

    • 他不能也添加更多的双引号吗? \"""
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多