首页 > 解决方案 > JS 使用与对象键相同的引号解析包裹在字符串中的对象

问题描述

考虑以下通过 WS 返回的事件负载数据:

{ 
  id: "1", 
  foo: "{"bar":"baz"}"
}

的当前输出JSON.stringify(event.foo)

"{\"bar\":\"baz\"}"

还要考虑后端没有真正的方法来返回foo格式不同的值,我需要找到一种方法来解析与此foo键关联的字符串,以便访问它的值bar

已确定的问题是用于包装整个假定对象的引号与对象本身中使用的引号相同,导致JSON.parse()不可能。

我想知道是否有一种“干净”的方式来实现这一目标。

到目前为止,我尝试过:

任何输入表示赞赏

标签: javascriptjsonstringparsing

解决方案


这里的问题是后端确实应该修复,但由于某种原因你不能这样做。下一个问题是你可以在前端“修复它”,但是你在这个问题上贴了一个创可贴,当返回的数据不是你期望的时候它就会掉下来。因此,除非您知道返回的数据将是特定类型,否则解决方案将容易出错。

话虽如此,您可以使用几个正则表达式修复简单示例中的无效 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)


推荐阅读