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 в объекте: ключ опускается. В массиве: становится null
  • Date сериализуется в ISO-строку, но parse НЕ восстановит обратно в Date
  • Циклические ссылки — ошибка. Решение: replacer или WeakSet для трекинга
  • NaN/Infinity становятся null в JSON