将 json 字符串转换为 Javascript 中的对象

Converting json String to Object in Javascript

我在 JS 中有以下 var 形式的文本,这是我从另一个函数获得的。

    var text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]';

我需要检查 a1、a2、c2 的计数及其值以及 a3 及其值。 如:a1:2,a2:2,c2:4,a3:3等等(子元素的个数也是)

我能想到的获得结果的粗略方法是首先删除第一个和最后一个“并替换 }”,”{ 为 },{ 这给了我一个 json 对象数组,使用 JSON.parse 给了我一个更好的转换结构,然后我可以轻松地遍历它。 我找不到任何库或其他解决方案来替代它。

 var text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]';

        console.log(text);

        text = text.replace(/\["{/g, "[{"); // remove first double quote
        text = text.replace(/\}"]/g, "}]"); // remove last double quote
        text = text.replace(/\}","{/g, "},{"); // replace middle quotes

        console.log(text);

        var formattedText = JSON.parse(text);

        console.log(formattedText);

我以对象形式获取它后的预期输出,因为我可以遍历对象并使用计数器来维护计数:

a1:2,a2:2,c2:4,a3:3

是否有任何功能(内置或库)可以帮助我解决这个问题?

您可以 尝试 通过删除不是 key/value 定界符的引号来修复该字符串,并将结果解析为 json:

var text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]';


t = text
    .replace(/"([^"]+)":/g, '@@:')
    .replace(/:"([^"]+)"/g, ':@@')
    .replace(/"/g, '')
    .replace(/@/g, '"')


console.log(JSON.parse(t))

如果您对这些替换的具体作用感兴趣,请查看下面的 step-by-step 可视化:

var text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]';

String.prototype.show = function(s) {
  console.log(s + ": " + this);
  return this;
}


t = text
    .show('Init')
    .replace(/"([^"]+)":/g, '@@:')
    .show('Step 1')
    .replace(/:"([^"]+)"/g, ':@@')
    .show('Step 2')
    .replace(/"/g, '')
    .show('Step 3')
    .replace(/@/g, '"')
    .show('Step 4')