解析包含单引号内转义引号的JSON时出错。

3

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

我尝试使用JSON.parse(jsonData)解析变量,但是出现了错误"Unexpected token H in JSON at position 30." 我不能改变变量的返回方式,所以这是我对问题的理解:

  1. JSON.parse(jsonData)出错是因为它无法识别转义的双引号,因为它完全被单引号包围。
  2. jsonData.replace(/\\"/g, "\\\\"")或其他组合都无法找到\",因为JavaScript将\"视为"

问题:如何正确解析此内容,通过替换转义引号为JSON.parse()可处理的内容或使用其他方法正确解析?我想坚持使用JSON.parse(),因为它很简单,但也可以考虑其他选项。

编辑:很遗憾,我不能在这个阶段更改变量,它只是一个更大的JSON响应的一个小例子。这是在应用程序获得API访问权限之前的临时解决方案,但我需要在此期间找到解决方案(IT部门可能很慢)。我现在正在直接访问API地址,获取一个大的JSON响应,并且浏览器使用用户OAuth的cookie进行身份验证。然后我将JSON响应复制并粘贴到我的应用程序中,以便处理数据。响应中充斥着转义的引号,手动编辑文本将是很费力的,我正在尝试避免在复制到变量之前将其复制到文本处理器中。


1
JSON实际来自哪里?正确的做法是在源头修复它。 - Phil
1
不清楚您是否对该变量的值有控制权。答案将根据此而改变。根据Max Meijer的答案,您编写代码示例的方式可以简单地更改字符串的值。 - Todd Chaffee
3个回答

3

在您的代码中,您需要用另一个反斜杠来作为前缀,对反斜杠字符进行转义。因此,代码应该改为:

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

第一个反斜杠是用来让JS将第二个反斜杠放在字符串中,这个反斜杠必须在字符串中,这样JSON解析器才知道它应该忽略引号字符。


1
OP说:“我无法改变变量的返回方式”。我认为这意味着他们不能只是将变量赋值为不同的字符串。 - Phil
感谢您的回复,@Max。请查看问题的EDIT部分,了解我为什么无法轻松更改字符串。 - mystackoverflow1212

1
我认为您也可以不使用初始字符串来表示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的便捷性。
使用字符串表示实际上是属性键值对会导致以后出现问题(例如,当您想以编程方式读取“人力资源*”值并使用它时)。
我希望您会发现这种方法有用!

1
这种情况的不幸之处在于,在JavaScript代码中,var jsonData = '{"Key":"query","Value":"dept=\"Human Resources*\"","ValueType":"Edm.String"}'var jsonData = '{"Key":"query","Value":"dept="Human Resources*"","ValueType":"Edm.String"}'之间没有区别。你可以将你对JSON的了解硬编码到程序中。例如,你可以用([\[\{,:]\s+)\"替换正则表达式出现的地方,然后再用$1\"来代替,但如果字符串Human Resources*也可能以:{,结尾,则无法正常工作。这也可能导致安全问题。在我看来,解决你的问题的最佳方法是将json响应放在某个json文件中,以便需要使用它的javascript代码可以将其读入字符串中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接