我有一个变量var jsonData = '{"Key":"query","Value":"dept=\"Human Resources*\"","ValueType":"Edm.String"}';
我正在尝试使用JSON.parse(jsonData)
解析变量,但是,出现错误“ JSON在位置30处出现意外令牌H”。我无法更改变量的返回方式,所以我对问题的理解如下:
JSON.parse(jsonData)
出错了,因为它没有将转义的双引号识别为已转义,因为它完全用单引号引起来了jsonData.replace(/\\"/g, "\\\\"")
或我尝试过的其他组合都找不到\"
,因为javascript将\"
视为"
问题如何通过用JSON.parse()可以处理的内容替换转义的引号,或使用其他内容来正确地解析此内容,来正确地解析此内容?由于它的简单性,我想坚持使用JSON.parse(),但可以使用其他选项。
编辑:不幸的是,我目前不能更改变量,这只是较大的JSON响应的一个小例子。在授予应用程序访问API的权限之前,这是一个临时解决方案,但在此之前我需要临时解决方案(IT部门可能很慢)。我现在正在做的事情是通过直接点击API地址来获得较大的JSON响应,浏览器使用用户OAuth的cookie进行身份验证。然后,我将JSON响应复制并粘贴到我的应用程序中,以便可以处理数据。响应中充斥着转义的引号,手动编辑文本会很费力,我正在尝试避免在复制到变量之前复制到文本处理器。
答案 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:
JSON.stringify(YOUR_OBJECT)
以获取字符串表示形式。JSON.parse(…)
,当您再次需要对象时。那应该能够满足您的最初请求,提出问题,保留当前的(转义的)字符串值,并给您一些进行大量更改的空间。
要转义当前的String值:
obj["Value"] = 'dept=\"Human Resources*\"'
或者,您可以嵌套属性:
obj["Value"]["dept"] = "Human Resources*"
出于其他原因,这可能会有帮助。
我发现我很少在不使用上述序列的企业或生产环境中使用JSON(在生产环境中我从未使用过纯字符串表示形式),仅仅是因为它的易用性修改属性,生成动态数据/修改JSON对象,以及实际上以编程方式使用JSON。
使用字符串表示形式来表示真正的属性键-值配对通常会在以后引起头痛(例如,当您要以编程方式读取Human Resources*
值并使用它时)。
我希望您认为这种方法有用!