如何取消对嵌套json的引用?

时间:2018-09-20 09:55:08

标签: json quoting

我正在处理一个API,该API返回带有各种字符串字段的JSON-其中一些引用为JSON。反过来,此JSON可能包含带有双引号JSON等的字符串字段。

读取此数据非常痛苦,因为没有格式化工具可以在引用的JSON上正常工作。是否有工具(命令行或其他方式)可以递归遍历我的JSON并取消引用包含有效JSON的任何字符串字段?

1 个答案:

答案 0 :(得分:1)

您可以尝试递归地重新解析JSON(重新解析直到不再更改为止):

var jsonWithQuotedJson = "{ \"a\": 1, \"b\": \"string\", \"c\": [2,\"otherString\"], \"d\": { \"e\": { \"a\": 1, \"b\": \"somestring\", \"c\": \"{ \\\"quotedJsonKey\\\": 42 }\" } } }";

var somethingChanged = false;

function reparse(obj) {
    if(Array.isArray(obj)) {
        for (var i = 0; i < obj.length; i++) {
            obj[i] = reparse(obj[i]);
        }
        return obj;
    } else if (typeof obj === 'object') {
        var keys = Object.keys(obj);
        for (var i = 0; i < keys.length; i++) {
            obj[keys[i]] = reparse(obj[keys[i]]);
        }
        return obj;
    } else {
        try {
            var res = JSON.parse(obj);
            // maybe a string as been turned into a new object?
            if (res !== obj) {
              somethingChanged = true;
              return res;
            }
            return obj;
        } catch (error) {
            return obj;
        }
    }
}
var res = JSON.parse(jsonWithQuotedJson);
do {
    somethingChanged = false;
    // just to log the progession of decoding
    console.log(JSON.parse(JSON.stringify(res)));
    res = reparse(res);
} while (somethingChanged);

console.log(res);