JSON - это текстовый формат для передачи и хранения данных. В JavaScript есть встроенные методы:
JSON.stringify- превратить значение в JSON-строкуJSON.parse- превратить JSON-строку обратно в значение
JSON похож на объекты и массивы, но у него есть строгие правила.
1) JSON.stringify: объект в строку
const user = { id: 1, name: "Sam", isActive: true };
const json = JSON.stringify(user);
console.log(json); // {"id":1,"name":"Sam","isActive":true}
console.log(typeof json); // "string"
Массив тоже можно сериализовать:
const nums = [1, 2, 3];
const json = JSON.stringify(nums);
console.log(json); // [1,2,3]
2) JSON.parse: строку в объект
const json = '{"id":1,"name":"Sam","isActive":true}';
const user = JSON.parse(json);
console.log(user); // { id: 1, name: "Sam", isActive: true }
console.log(typeof user); // "object"
3) Читабельное форматирование (pretty print)
У JSON.stringify есть параметры для форматирования:
- второй аргумент (replacer) чаще не нужен на старте
- третий аргумент - отступы
const data = { id: 1, name: "Sam", tags: ["js", "web"] };
const pretty = JSON.stringify(data, null, 2);
console.log(pretty);
Результат будет удобнее читать:
{
"id": 1,
"name": "Sam",
"tags": [
"js",
"web"
]
}
4) JSON строгий: важные отличия от JavaScript-объектов
JSON поддерживает только:
- числа
- строки (в JSON только двойные кавычки)
- boolean
- null
- массивы
- объекты
В JSON нельзя:
- функции
- undefined
- symbol
- комментарии
- trailing commas (запятые в конце)
- одиночные кавычки для строк
Примеры ограничений:
undefined и функции исчезают
const obj = {
a: 1,
b: undefined,
c: function () { return 1; }
};
const json = JSON.stringify(obj);
console.log(json); // {"a":1}
NaN и Infinity превращаются в null
const data = { n: NaN, i: Infinity, ok: 1 };
console.log(JSON.stringify(data)); // {"n":null,"i":null,"ok":1}
Date превращается в строку
const data = { createdAt: new Date("2025-01-01T00:00:00Z") };
const json = JSON.stringify(data);
console.log(json);
const parsed = JSON.parse(json);
console.log(parsed.createdAt);
console.log(typeof parsed.createdAt); // "string"
5) Ошибки парсинга: try/catch
Если строка не является валидным JSON, JSON.parse выбросит SyntaxError. Это нормальная ситуация для “внешних” данных.
const input = '{ "a": 1, }';
try {
const data = JSON.parse(input);
console.log(data);
} catch (e) {
console.log(e.name); // "SyntaxError"
}
6) JSON и localStorage: частый сценарий
localStorage хранит только строки, поэтому данные обычно сериализуют и парсят.
const state = { theme: "dark", fontSize: 14 };
localStorage.setItem("appState", JSON.stringify(state));
const raw = localStorage.getItem("appState");
const restored = raw ? JSON.parse(raw) : null;
console.log(restored); // { theme: "dark", fontSize: 14 }
7) JSON не равен “глубокая копия”
Иногда делают копию через JSON:
const a = { x: 1, nested: { y: 2 } };
const b = JSON.parse(JSON.stringify(a));
b.nested.y = 99;
console.log(a.nested.y); // 2
console.log(b.nested.y); // 99
Это действительно создает отдельную структуру, но есть минусы:
- теряются
Date,undefined, функции,NaN,Infinity - не работает с циклическими ссылками
Пример циклической ссылки:
const a = {};
a.self = a;
try {
JSON.stringify(a);
} catch (e) {
console.log(e.name); // "TypeError"
}
Поэтому JSON-копирование - прием только для простых данных.
Что стоит запомнить
JSON.stringifyпревращает значение в строку JSON.JSON.parseпревращает JSON-строку обратно в данные.- JSON строгий: нет функций, undefined, комментариев, запятых в конце.
- Для парсинга внешних данных часто нужен
try/catch. - JSON-подход подходит для хранения и передачи простых структур.