解析包含JSON字符串的JSON对象

6

我想解析一个包含某些值的JSON对象,这些值本身也是一个JSON字符串。需要注意的是,我之前不知道这些字段,所以不能像这样操作:obj[key]=JSON.parse(obj[key])。我正在寻找一种简单的方法来实现解析。

obj={
  Name:"{\"FirstName\":\"Douglas\",\"LastName\":\"Crockford\"}"
}

And I want to get

{
  Name:{
      FirstName:"Douglas",
      LastName:"Crockford"
      }
}
6个回答

1
如果你想对此进行悖论式的处理,可以使用"reviver parameter"来处理任意嵌套版本的这种情况。首先将你的对象stringifying
function parseJSON(k,v) {
  try { return JSON.parse(v, parseJSON); }
  catch(e) { return v; }
}
JSON.parse(JSON.stringify(obj), parseJSON);

那是不是很棒呢,还是只有我这样认为?


0
我们将编写一个方便的小工具,它可以将函数映射到对象属性上:
function mapObject(obj, fn) {
  const result = {};
  for (const prop in obj) result[prop] = fn(obj[prop], prop);
  return result;
}

现在,您可以通过简单地说出来,使用输入解析的所有JSON值创建一个对象。
mapObject(obj, JSON.parse)

如果您想防止属性值不是有效的JSON,则
function parseJSON(x) {
  try { return JSON.parse(x); }
  catch (e) { return x; }
}

然后

mapObject(obj, parseJSON)

0
我已经成功地使用: jsonData['key']['value']

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

0
你可以使用 Object.keys(obj) 来获取属性名称,以便使用 JSON.parse()

是的,谢谢。我本以为我可以有更好的解决方案,但现在看来这就是我能做到的。 - nadhem
我必须使用try和catch,以防某些值不是json格式。 - nadhem

0

您可以尝试/跳过每个键:

a = {
  a: 1,
  b: JSON.stringify({a: 1, b: 2}),
  c: 'asdf'
}
console.log(a);
new_a = {}
Object.keys(a).map((key) => {
  try {
    new_a[key] = JSON.parse(a[key]);
  } catch(err) {
    new_a[key] = a[key];
  }
})

console.log(new_a);


纯粹主义者会说这是对 map 的误用,应该使用 forEach。他们的逻辑是 map 旨在将一个数组转换为另一个数组,不应该用于其副作用,例如改变输入。 - user663031
我会用 foreach 来完成,这样更方便。 - nadhem

0

您可以简单地循环遍历所有的键:

obj={
  Name: "{\"FisrtName\":\"Douglas\",\"LastName\":\"Crockford\"}",
  Other: "This isn't JSON"
};
for (var key in obj) {
    try {
        obj[key] = JSON.parse(obj[key]);
    } catch(err) {
        // ignore error, just leave it alone
    }
}
console.log(obj);


如果某些值不是有效的 JSON 字符串,就会出现问题。 - Dekel
我以为所有的值都是JSON格式,没有在问题中看到“一些”。 - Barmar
从这个问题来看,“请注意我之前不知道那些字段,所以我不能像 obj[key]=JSON.parse(obj[key]) 这样做”。 - Dekel
就像我说的那样,我没有注意到。我已经更新了答案。 - Barmar
1
@Dekel 我使用 for,你使用 map - Barmar
显示剩余2条评论

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