JSON
Формат обмена данными и встроенные методы работы с ним.
Зачем нужно
JSON (JavaScript Object Notation) — стандарт обмена данными между клиентом и сервером. Встроенные методы parse/stringify. Поддерживается везде.
Где используется
- Обмен данными с API (REST, GraphQL)
- Хранение в localStorage/sessionStorage
- Конфигурационные файлы (package.json, tsconfig.json)
Code
// Сериализация
const json = JSON.stringify({ name: 'Anton', age: 25 });
// '{"name":"Anton","age":25}'
// С форматированием
JSON.stringify(obj, null, 2); // с отступами
// Фильтрация полей (replacer)
JSON.stringify(user, ['name', 'email']);
JSON.stringify(data, (key, value) =>
key === 'password' ? undefined : value
);
// Парсинг
const obj = JSON.parse('{"name":"Anton"}');
// Reviver — преобразование при парсинге
JSON.parse(json, (key, value) => {
if (key === 'date') return new Date(value);
return value;
});
// toJSON — кастомная сериализация
class User {
constructor(name, token) { this.name = name; this.token = token; }
toJSON { return { name: this.name }; } // без token
}
// JSON не поддерживает: undefined, Function, Symbol, Infinity, NaN
// Date → строка, RegExp → {}
Связанные темы
Ресурсы
⚡ Источник: JavaScript JSON как эффективный прием оптимизации холодного старта · AsForJS
- 📅 2023-05-17 · YouTube
- Тезисы:
JSON.parse('{...}')парсится V8 быстрее, чем тот же object literal в JS-коде- Причина: парсер JSON прост и не выполняет полный JS-парсинг (нет evaluation выражений)
- Большие static конфиги выгоднее держать в
.json()и парсить, а не как inline object literal - Парадокс: текст длиннее, но cold start быстрее
- Цитата: «JSON парсится быстрее, чем тот же объект в JS. Это контринтуитивно, но факт»
Подводные камни JSON
- BigInt и Symbol теряются при
stringify— BigInt бросает TypeError, Symbol игнорируется undefinedв объекте: ключ опускается. В массиве: становитсяnullDateсериализуется в ISO-строку, ноparseНЕ восстановит обратно в Date- Циклические ссылки — ошибка. Решение:
replacerилиWeakSetдля трекинга NaN/Infinityстановятсяnullв JSON