【问题标题】:JSON parse of quote inside double quote双引号内引号的 JSON 解析
【发布时间】:2018-07-12 18:12:37
【问题描述】:

我的值是一个字符串:

"['Eitaj', 'Jason Json', 'Eitaj M', "Jason Json's"]"

我正在尝试使用JSON.parse() 解析它, 但是,我收到错误

Uncaught SyntaxError: Unexpected token ' in JSON at position 1

我发现工作正确的字符串是:

JSON.parse('["Eitaj", "Jason Json", "Eitaj M", "Jason Json\'s"]')

除了将单引号和双引号放在一起之外,我还有什么技巧可以使用吗?

【问题讨论】:

  • 您的第一个字符串无效。
  • @Zenoo "['Eitaj', 'Jason Json', 'Eitaj M', \"Jason Json's\"]",将字符串保存为"['Eitaj', 'Jason Json', 'Eitaj M', "Jason Json's"]"
  • 如果您最终需要提取个人姓名(EitajJason Json...),JSON 对象不会有太大帮助,因为,好吧,您不需要以 JSON 开头。您对数据格式有任何控制权吗?
  • @ÁlvaroGonzález 不,这是我发布的来自其他系统的字符串。
  • 你确定它应该是 JSON 吗?因为如果它使用单引号括起来字符串,它不遵守 ECMA-404 或 RFC7159。

标签: javascript json


【解决方案1】:

检查这是否适合您。

let s = "['Eitaj', 'Jason Json', 'Eitaj M', \"Jason Json's\"]";

let parsed = JSON.parse(s.split(",").map(seg => {
  return seg.replace(new RegExp("'.*'", "g"), function(match) {
    return '"' + match.substring(1, match.length - 1) + '"';
  })
}).join(","));

console.log(parsed);

更新 1

这将处理 cmets 中提到的上述 sn-p 的缺陷。但是,仍然可能存在其他应根据您的要求处理的边缘情况。

let s = "['Eitaj', 'Jason Json', 'Eitaj M', \"Jason Json's\",\"Test'test'Test\",'Acme, Inc.',\"'Test'\"]";

let parsed = JSON.parse("[" + s.substring(1, s.length - 1).match(new RegExp(`((['\""]).*?(\\2))`, "g")).map(seg => {
  return seg.trim().replace(new RegExp("^'.*'$", "g"), function(match) {
    return '"' + match.substring(1, match.length - 1) + '"';
  })
}).join(",") + "]")

console.log(parsed);

【讨论】:

  • 小心,对于正确包含在包含至少两个单引号的双引号中的值,这注定会失败,例如"Test'test'Test"
  • ... 或带逗号的名称 ('Acme, Inc.')。
  • 已更新以处理提到的流程。没有尝试处理其他边缘情况。不过可能还有很多其他的。
  • @ChathuraWidanage 对我来说是完美的。
猜你喜欢
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
相关资源
最近更新 更多