我正在处理一个API,该API返回带有各种字符串字段的JSON-其中一些引用为JSON。反过来,此JSON可能包含带有双引号JSON等的字符串字段。
读取此数据非常痛苦,因为没有格式化工具可以在引用的JSON上正常工作。是否有工具(命令行或其他方式)可以递归遍历我的JSON并取消引用包含有效JSON的任何字符串字段?
答案 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);