#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, используя экранированные обратные косые черты в строковых литералах и тому подобное.)