javascript - JS 使用与对象键相同的引号解析包裹在字符串中的对象
问题描述
考虑以下通过 WS 返回的事件负载数据:
{
id: "1",
foo: "{"bar":"baz"}"
}
的当前输出JSON.stringify(event.foo)
:
"{\"bar\":\"baz\"}"
还要考虑后端没有真正的方法来返回foo
格式不同的值,我需要找到一种方法来解析与此foo
键关联的字符串,以便访问它的值bar
。
已确定的问题是用于包装整个假定对象的引号与对象本身中使用的引号相同,导致JSON.parse()
不可能。
我想知道是否有一种“干净”的方式来实现这一目标。
到目前为止,我尝试过:
JSON.parse()
由于字符串提升的格式,使用which 失败Unexpected end of JSON input
- 修剪外部引号并将内部引号转换为单个然后解析,会导致相同的错误。
- 使用
new Object(...)
基于字符串(修剪外部引号) - 用单引号替换所有引号并将其再次包装成双引号以解析它。
任何输入表示赞赏
解决方案
这里的问题是后端确实应该修复,但由于某种原因你不能这样做。下一个问题是你可以在前端“修复它”,但是你在这个问题上贴了一个创可贴,当返回的数据不是你期望的时候它就会掉下来。因此,除非您知道返回的数据将是特定类型,否则解决方案将容易出错。
话虽如此,您可以使用几个正则表达式修复简单示例中的无效 JSON。问题是,如果您的数据在文本中包含 } 等字符,这将失败。
var response = `
{
id: "1",
foo: "{"bar":"baz"}",
goo: "{"gar":"gaz"}"
}
`
var reObj = /"(\{[^}]*})"/
while (response.match(reObj)) {
response = response.replace(reObj, '$1')
}
var reKey = /^\s+(\S+):/m
while (response.match(reKey)) {
response = response.replace(reKey,'"$1":')
}
var obj = JSON.parse(response)
console.log(obj)