【问题标题】:Error parsing JSON with escaped quotes inside single quotes用单引号内的转义引号解析 JSON 时出错
【发布时间】:2019-10-14 11:30:51
【问题描述】:

我有一个变量var jsonData = '{"Key":"query","Value":"dept=\"Human Resources*\"","ValueType":"Edm.String"}';

我正在尝试使用 JSON.parse(jsonData) 解析变量,但是,我收到错误“JSON 中第 30 位的意外令牌 H”。我无法更改变量的返回方式,所以我认为我对这个问题的理解如下:

  1. JSON.parse(jsonData) 出错,因为它无法将转义的双引号识别为转义,因为它完全包含在单引号中
  2. jsonData.replace(/\\"/g, "\\\\"") 或我尝试过的其他组合没有找到 \",因为 javascript 将 \" 视为 "

问题我怎样才能正确地解析这个,要么用 JSON.parse() 可以处理的东西替换转义的引号,要么使用其他东西来正确解析它?我想坚持使用 JSON.parse() ,因为它很简单,但对其他选项持开放态度。

编辑:不幸的是,我无法在此阶段更改变量,这只是较大 JSON 响应的一个小示例。这是一个临时解决方案,直到应用程序被授予访问 API 的权限,但在此之前我需要临时解决方案(IT 部门可能会很慢)。我现在正在做的事情是通过直接点击 API 地址来获取大型 JSON 响应,并且浏览器使用来自用户 OAuth 的 cookie 进行身份验证。然后我将 JSON 响应复制并粘贴到我的应用程序中,以便我可以处理数据。响应中充满了转义的引号,手动编辑文本会很费力,我试图避免在复制到变量之前复制到文本处理器中。

【问题讨论】:

  • JSON 究竟来自哪里?正确的做法是从源头上修复它
  • 不清楚您是否可以控制该变量的值。答案会根据情况而改变。按照您编写代码示例的方式,您可以根据 Max Meijer 的答案简单地更改字符串的值。

标签: javascript json string


【解决方案1】:

您应该通过在代码中添加另一个反斜杠来对反斜杠字符进行转义。于是代码变成了:

var jsonData = '{"Key":"query","Value":"dept=\\"Human Resources*\\"","ValueType":"Edm.String"}';

第一个反斜杠是为了让 JS 把第二个反斜杠放在字符串中,它必须在字符串中,以便 json 解析器知道它应该忽略引号字符。

【讨论】:

  • OP 说 “我无法更改变量的返回方式”。我认为这意味着他们不能只是将变量赋值更改为不同的字符串
  • 感谢您的回复,@Max。请参阅问题的编辑部分,了解为什么我无法轻松更改字符串
【解决方案2】:

我认为你也可以省去初始的String来表示JSON对象:

  1. 使用标准 JSON 对象。
  2. 对该对象进行所需的任何更改。
  3. 调用JSON.stringify(YOUR_OBJECT) 获取字符串表示形式。
  4. 然后,当您再次需要对象时,JSON.parse(…)

这应该能够满足您的初始请求、问题、保留当前(转义的)字符串值,并为您提供一些空间来进行大量更改。

转义当前字符串值:

  1. obj["Value"] = 'dept=\"Human Resources*\"'

或者,您可以嵌套属性:

  1. obj["Value"]["dept"] = "Human Resources*"

出于其他原因,这可能会有所帮助。

我发现我很少在不使用上述序列的企业或生产环境中使用 JSON(我从未在生产环境中使用纯字符串表示),这仅仅是因为易于修改属性,生成动态数据/修改 JSON 对象,并以编程方式实际使用 JSON。

对真正的属性键值对使用字符串表示通常会在以后引起麻烦(例如,当您想以编程方式读取 Human Resources* 值并使用它时)。

我希望你觉得这种方法有帮助!

【讨论】:

    【解决方案3】:

    这种情况的不幸之处在于,在 JavaScript 代码中没有区别

    var jsonData = '{"Key":"query","Value":"dept=\"Human Resources*\"","ValueType":"Edm.String"}'

    var jsonData = '{"Key":"query","Value":"dept="Human Resources*"","ValueType":"Edm.String"}'.

    您可以将有关 JSON 的信息硬编码到您的编程方式中。例如,您可以用$1\" 替换出现的正则表达式([\[\{,:]\s+)\",但如果字符串Human Resources* 也可以以:{, 结尾,这将无法工作。这也可能导致安全问题。

    在我看来,解决问题的最佳方法是将 json 响应放在 json 文件中的某个位置,以便需要使用它的 javascript 代码将其读入字符串。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 2011-12-22
      • 2015-06-30
      相关资源
      最近更新 更多