Построить вложенную экранированную строку JSON для рекурсивного получения JSON.parse () - PullRequest
0 голосов
/ 15 октября 2019

Сервер возвращает мне строку JSON, подобную этой:

{"payload":{"data":"{\"notification_type\":\"{\"type1\":\"{\"type2\":\"type2 value\"}\"}\"}"}}

Эта строка, как я понимаю, не может быть проанализирована с помощью API JSON.parse (), поскольку вложенные строки JSON в строке должны быть правильноубежали. Если строка не экранирована должным образом, я получаю следующую ошибку:

Uncaught SyntaxError: Unexpected token n in JSON at position 22

Итак, строка должна быть экранирована должным образом с учетом вложенной природы, как показано ниже, чтобы JSON.parse () мог ее обработать:

var properString = "{\"payload\":{\"data\":\"{\\\"notification_type\\\":\\\"{\\\\\\\"InternalKey\\\\\\\":\\\\\\\"InternalValue\\\\\\\"}\\\"}\"}}";
console.log("Proper String = ");
console.log(properString);
var firstLevelObject = JSON.parse(properString);
console.log("First Level Object = ");
console.log(firstLevelObject);
var secondLevelObject = JSON.parse (firstLevelObject.payload.data);
console.log("Second Level Object = ");
console.log(secondLevelObject);
var thirdLevelObject = JSON.parse(secondLevelObject.notification_type);
console.log("Third Level Object = ");
console.log(thirdLevelObject);

Вот так выводит консоль Google Chrome: enter image description here

Однако я не могу преобразовать неправильную строку изсервер должен правильно экранировать строку, как определено в переменной properString, чтобы JSON был правильно сконструирован, что может быть пройдено. Как можно преобразовать строку с правильными escape-символами?

Справочные источники: я сослался на этот ответ, чтобы понять, как следует добавлять вложенные escape-символы, но в ответе не указывается, как происходит преобразованиеможно сделать.

1 Ответ

1 голос
/ 16 октября 2019

На самом деле, полученная строка JSON не совсем верна. Это не правильный синтаксис JSON во вложенной строке JSON. Но вы можете перестроить его в правильную синтаксическую строку JSON с помощью регулярного выражения или собственного JS.

var obj = '{"payload":{"data":"{\"notification_type\":\"{\"type1\":\"{\"type2\":\"type2 value\"}\"}\"}"}}';
var payloadString = obj.substring(0, 20).concat('"}}');
obj = obj.substring(20, obj.length - 3).replace("\"{", "{").replace("}\"}", "}}").replace("}\"}", "}}").replace("\"{", "{");

var data = JSON.parse(obj);
var obj2 = JSON.parse(payloadString);

//console.log(payload);
//console.log(data);
obj2.payload.data = data;
console.log(obj2);
...