Как убрать вложенные JSON? - PullRequest
0 голосов
/ 20 сентября 2018

Я имею дело с API, который возвращает JSON с различными строковыми полями, некоторые из которых указаны в JSON.Этот JSON, в свою очередь, может содержать строковые поля с двойными кавычками JSON и т. Д.

Чтение этих данных является огромной болью, потому что ни один инструмент форматирования не будет правильно работать с цитируемым JSON.Есть ли инструмент (командная строка или иным образом), который может рекурсивно пройтись по моему JSON и удалить из кавычек любые строковые поля, содержащие действительный JSON?

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете попробовать рекурсивно проанализировать ваш 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);
...