【问题标题】:Why does JSON.parse fail to parse this JSON string: `{ "Search results: \":s\"": "" }`? [duplicate]为什么 JSON.parse 无法解析这个 JSON 字符串:`{ "Search results: \":s\"": "" }`? [复制]
【发布时间】:2021-04-25 00:30:00
【问题描述】:

为什么JSON.parse解析下面的JSON字符串失败?

这不是有效的 JSON 吗?

奇怪的是,https://jsonlint.com/ 会验证此字符串,即使其自定义 JSON parser 会引发与 JSON.parse 相同的错误。

JSON 字符串

{
    "Search results: \":s\"": ""
}

代码

let test = `{
    "Search results: \":s\"": ""
}`
JSON.parse(test);

结果

VM1882:2 Uncaught SyntaxError: Unexpected token s in JSON at position 22 在 JSON.parse() 在:1:6

【问题讨论】:

  • 反斜杠字符引用" 字符作为外层字符串。您必须将反斜杠加倍,因为有两个解析阶段。
  • 或者你必须let test = String.raw`{ ... }`
  • @Pointy 感谢您的快速响应。澄清一下,jsonlint.com 认为这个 JSON 有效是错误的吗?
  • @Thomas 使用 String.raw 似乎有效。你知道为什么吗?你也想发帖作为答案吗?
  • 不,jsonlint.com 没有错,这是有效的 JSON。问题是您将其逐字输入到 JavaScript 文档中,而没有为 JavaScript 转义它。如果将相同的内容放入文本文件,加载文本文件,然后将内容解析为 JSON,则可以正常工作。

标签: javascript json jsonlint


【解决方案1】:

使用双反斜杠来转义 JavaScript 字符串中要被解析为 JSON 的引号:

let test = `{
  "Search results: \\":s\\"": ""
}`
console.log(JSON.parse(test));

{ 'Search results: ":s"': '' }

如上面的 cmets 中所述,在 JavaScript 代码字符串中写入引号时会出现问题,因为反斜杠本身必须被转义以保留在字符串中作为将来 JSON.parse 的反斜杠。 JavaScript 将字符串中的第一个反斜杠视为转义字符,而不是这种情况下必需的文字字符。如果数据是从 JavaScript 代码以外的其他来源读取的,则只需要一个反斜杠。

【讨论】:

  • 谢谢。这帮助我们找到了根本原因。这个问题是问题的简化版本。
猜你喜欢
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 2020-11-28
  • 2021-09-04
  • 2017-07-07
相关资源
最近更新 更多