Из-за чего JSON становится невалидным
JSON строже JavaScript, и ошибки почти всегда сводятся к нескольким случаям:
| Ошибка | Почему | Исправление |
|---|---|---|
| {"a": 1,} | Висячая запятая | Уберите запятую перед } или ]. |
| {'a': 1} | Одинарные кавычки | Строки и ключи используют только двойные кавычки. |
| {a: 1} | Ключ без кавычек | Возьмите его в кавычки: "a". |
| // comment | В JSON нет комментариев | Удалите их или используйте JSON5 / JSONC там, где потребитель это поддерживает (настройки VS Code, tsconfig). |
| 0123, .5, NaN, Infinity | Недопустимые числа | Без ведущих нулей, цифра перед точкой, без NaN/Infinity. |
| "line\nbreak" | Буквальный перевод строки внутри строки | Экранируйте его как \n. |
| undefined | Не является значением JSON | Используйте null. |
Мягкий режим удаляет комментарии и висячие запятые и заменяет одинарные кавычки перед разбором — это удобно для конфигурационных файлов, написанных вручную. Результат всегда строгий JSON.
YAML
YAML по духу является надмножеством JSON (любой JSON-документ — валидный YAML), но он гораздо шире: структуру задают отступы, строки обычно без кавычек, а некоторые голые слова имеют неожиданные значения. yes, no, on и off становятся булевыми в парсерах YAML 1.1, 022 может стать восьмеричным 18, а 3.10 превращается в 3.1. Конвертер берёт такие значения в кавычки при выводе YAML, чтобы они переживали обратное преобразование. Направление YAML → JSON поддерживает распространённое блочное подмножество: отображения, списки, скаляры, строки в кавычках, flow-коллекции и блоки | / >.
Большие документы
Всё выполняется в вашем браузере, так что несколько мегабайт — не проблема. Статистика дерева (глубина, количество объектов и массивов) помогает заметить неожиданно вложенные данные до того, как вы загрузите их во что-то, что на них захлебнётся.
Вопросы
Почему мой JSON невалиден, хотя он работает в JavaScript?
Объектные литералы JavaScript допускают ключи без кавычек, одинарные кавычки, висячие запятые, комментарии и hex-числа. JSON не допускает ничего из этого. Включите мягкий режим, чтобы увидеть, какой будет строгая форма.
Как найти ошибку на строке 2000 большого файла?
Валидатор сообщает строку и колонку и показывает текст вокруг ошибки. Большинство редакторов переходят к строке по Ctrl-G.
Меняет ли форматирование данные?
Нет. Форматирование и минификация меняют только пробельные символы. Сортировка ключей меняет порядок, который JSON не считает значимым, но некоторые потребители (подписи, канонический JSON) — считают.
Почему число потеряло точность?
Числа в JavaScript — это double, поэтому целые больше 2⁵³ (около 9 × 10¹⁵) округляются при разборе. Если вы форматируете документ с такими идентификаторами, храните их как строки.