Какие особенности у JSON
Что проверяют
Знаете ли вы JSON не в общих словах «лёгкий и читаемый», а на уровне того, что сломается при JSON.stringify и JSON.parse. Следом обычно просят объяснить, почему после глубокого копирования через JSON дата превратилась в строку.
Как отвечать
Начните с формата. JSON описан в RFC 8259 и ECMA-404, это текст, который при обмене между системами передаётся в UTF-8. Типов шесть: строка, число, true/false, null, объект и массив. Синтаксис строже, чем у объектов в JS:
- ключи и строки: только в двойных кавычках, одинарные дадут
SyntaxError; - никаких комментариев и висячих запятых: поэтому для конфигов часто берут JSON5 или YAML;
- числа: без
NaN,Infinity, ведущих нулей и шестнадцатеричной записи.
Дальше то, что важно фронтенду при сериализации:
- потеря типов:
Dateпревращается в ISO-строку через свойtoJSON()и обратно сам не восстановится,MapиSetстанут пустыми объектами; - пропуски:
undefined, функции иSymbolв объекте выпадают, а в массиве превращаются вnull.NaNиInfinityтоже становятсяnull; - ошибки: циклическая ссылка и
BigIntбросаютTypeError; - большие числа: в JS число это double, после
Number.MAX_SAFE_INTEGERцелые теряют точность, поэтому длинные ID с бэкенда передают строкой.
У обеих функций есть дополнительные аргументы: reviver в JSON.parse восстанавливает даты при разборе, replacer в JSON.stringify фильтрует поля, третий аргумент задаёт отступы. Для копирования объектов с датами и Map есть structuredClone.
Где спотыкаются
Пишут, что у JSON нет схем. Спецификация JSON Schema существует и широко используется, в том числе для валидации ответов API и генерации типов.
Вызывают JSON.parse на данных из localStorage или ответа сервера без try/catch. Одна битая строка роняет весь компонент.
Используют JSON.parse(JSON.stringify(obj)) как универсальную глубокую копию и теряют даты, undefined, Map и экземпляры классов.