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

时间:2019-06-19 10:51:17

标签: javascript jquery json underscore.js

我在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

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

1 个答案:

答案 0 :(得分:2)

您可以尝试通过删除不是键/值分隔符的引号并将其解析为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, '@$1@:')
    .replace(/:"([^"]+)"/g, ':@$1@')
    .replace(/"/g, '')
    .replace(/@/g, '"')


console.log(JSON.parse(t))

如果您对这些替代品的确切用途感兴趣,请按以下步骤进行可视化操作:

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, '@$1@:')
    .show('Step 1')
    .replace(/:"([^"]+)"/g, ':@$1@')
    .show('Step 2')
    .replace(/"/g, '')
    .show('Step 3')
    .replace(/@/g, '"')
    .show('Step 4')