Как проанализировать JSON с экранированными двойными кавычками, используя node.js ?

#node.js #json #parsing #escaping #double-quotes

#node.js #json #синтаксический анализ #экранирование #двойные кавычки

Вопрос:

Вот пример некоторого JSON, с которым я работаю:

 {"name":"John","attributes":"{"key":"value"}"}
  

Вот он снова, в более удобочитаемом формате:

 {
    "name": "John",
    "attributes": "{"key":"value"}"
}
  

Обратите внимание выше, что двойные кавычки, окружающие ключ и значение, экранированы. Это необходимо и является допустимым JSON (проверяется на jsonlint.com ).

Я пытаюсь получить значение «name», но экранированные двойные кавычки вызывают ошибку.

Что я делаю не так в моем node.js код?

 var theString = '{"name":"John","attributes":"{"key":"value"}"}';
var theJSON = JSON.parse(theString);
var theName = theJSON.name;
console.log("name = "   theName);
  

Ниже приведен вывод. Ошибка возникает во 2-й строке моего кода, где я «JSON.parse ()» строка. Похоже, что JSON.parse удаляет обратную косую черту, превращая допустимый JSON в недопустимый JSON.

 undefined:1
{"name":"John","attributes":"{"key":"value"}"}
                               ^
SyntaxError: Unexpected token k in JSON at position 31
  

Ответ №1:

Поскольку эта часть данных представляет собой JSON-within-JSON, вы должны проанализировать JSON, а затем проанализировать JSON в attributes свойстве:

 const obj = JSON.parse(json);
obj.attributes = JSON.parse(obj.attributes);
  

Живой пример:

 const json = document.getElementById("json").textContent;

const obj = JSON.parse(json);
obj.attributes = JSON.parse(obj.attributes);
console.log(obj);  
 <pre id="json">{
    "name": "John",
    "attributes": "{"key":"value"}"
}</pre>  

Комментарии:

1. Ти Джей, можешь привести пример, в котором не используется document.getElementById(«json»).textContent ? Я вызываю REST API и получаю обратно строку. Это то, с чем мне приходится работать.

2. @metrangia — json в этом примере это строка, как если бы вы получили ее из rest API. (На самом деле, именно поэтому я сделал это так, как я сделал, чтобы мне не пришлось создавать JSON, используя экранированные обратные косые черты в строковых литералах и тому подобное.)