JSON.stringify
помощник в JavaScript (насколько мне известно) при вызове экземпляра класса ищет toJSON()
метод и автоматически вызывает его для данного экземпляра, а затем использует его вывод в качестве значения. Интересно, есть ли аналогичный механизм для противоположной операции? Есть ли у JSON.parse
обратный вызов по умолчанию, который будет вызываться при десериализации строки?
Поэтому я отрицаю их из-за отсутствия (задокументированных) исследовательских усилий.
Да, JSON.parse() имеет параметр оживления, который можно передать при десериализации.
Вот пример использования
const json = `{
"a": "1",
"b": "true",
"c": "foo",
"d": "world",
"e": "2020-12-26",
"f": "bar"
}`;
function reviver(key, value) {
if (key === "a") //convert to number
return Number(value);
if (key === "b") //convert to boolean
return value === "true";
if (key === "c") //change value entirely
return "hello";
if (key === "e") //convert to a different object
return new Date(value);
if (key === "f") //omit key-value pair
return;
return value; //preserve anything else
}
const obj = JSON.parse(json, reviver);
console. log(obj);
Да; вы можете предоставить функцию «возрождения» (см. руководство), которую вы потенциально можете использовать для распознавания специальных данных в вашем JSON и их соответствующего анализа. Например, даты преобразуются в строки с помощью JSON.stringify
, а JSON.parse
оставляет их как таковые, поэтому возвращает строку, которая является результатом Date.toJSON
. Однако, указав функцию «reviver», мы можем обнаружить наш объект даты (по его ключу в моем примере — вы также можете обнаружить вывод вашей функции toJSON
в значении) и вернуть объект Date
, а не строку:
const obj = {
id: 1,
date: new Date(2020, 12, 25, 15, 4, 5)
}
const json = JSON.stringify(obj);
console.info(json);
let parsedObj = JSON.parse(json);
console.info(parsedObj.date.toString());
parsedObj = JSON.parse(json, (key, value) =>
key == 'date' ? new Date(value) : value
);
console.info(parsedObj.date.toString());
Беглый просмотр документации должен ответить на этот вопрос