解析带有单引号内的转义引号的JSON

时间:2019-05-28 22:06:34

标签: javascript json string

我有一个变量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响应复制并粘贴到我的应用程序中,以便可以处理数据。响应中充斥着转义的引号,手动编辑文本会很费力,我正在尝试避免在复制到变量之前复制到文本处理器。

3 个答案:

答案 0 :(得分:3)

您应该在代码中使用另一个反斜杠作为前缀来转义反斜杠字符。因此代码变为:

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

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

答案 1 :(得分: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*也可以以:,{{1}结尾,则将无法正常工作}或{。这也可能导致安全问题。

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

答案 2 :(得分:0)

我认为您也可以省去代表JSON对象的初始String:

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

那应该能够满足您的最初请求,提出问题,保留当前的(转义的)字符串值,并给您一些进行大量更改的空间。

要转义当前的String值:

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

或者,您可以嵌套属性:

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

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

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

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

我希望您认为这种方法有用!