JSON не разбирается, когда текст нарушает строгий синтаксис формата: лишняя запятая, одинарные или типографские кавычки, комментарий, значение из Python, обрезанный конец. Почти все такие ошибки — следы JavaScript, Python или ручной правки. Ниже — каталог типичных ошибок с исправлениями, а все ошибки документа сразу покажет проверка JSON.
Почему JSON строже, чем кажется
JSON похож на объект JavaScript, но правила у него жёстче. Ключи и строки — только в двойных кавычках. После последнего элемента запятой нет. Комментариев нет. Значения — строка, число, объект, массив, true, false или null, и только в нижнем регистре. Стандарт RFC 8259 разрешает парсеру принимать расширения формата, но строгие парсеры — JSON.parse в браузере, json.loads в Python и многие другие — не угадывают и падают на первом же нарушении.
Сообщение об ошибке обычно называет позицию — номер символа от начала текста, — но не причину. «Unexpected token», «Expecting value», «Syntax error» звучат одинаково для десятка разных поломок. Поэтому полезнее знать типичные причины в лицо.
Висячая запятая
Самая частая ошибка: запятая после последнего элемента массива или объекта. В JavaScript и Python так писать можно, и шаблоны на сервере часто оставляют её при генерации списка.
{
"items": [
{ "sku": "A-102", "qty": 3 },
{ "sku": "A-117", "qty": 1 },
],
}{
"items": [
{ "sku": "A-102", "qty": 3 },
{ "sku": "A-117", "qty": 1 }
]
}Кавычки: одинарные, типографские, ключи без кавычек
Строки и ключи в JSON пишутся только в прямых двойных кавычках ". Три частые поломки:
- одинарные кавычки —
'id'вместо"id": так пишут в JavaScript и так печатает словари Python; - ключи без кавычек —
{id: 1}: объект скопирован из кода или из консоли браузера; - типографские кавычки
“ ”и« »: их подставляют Word, Google Docs, заметки на телефоне и мессенджеры при автозамене. На глаз“host”почти не отличается от"host", а для парсера это посторонний символ.
{
"outbounds": [
{ "protocol": "vless", "settings": { "address": “vpn.example.com”, port: 443 } }
]
}{
"outbounds": [
{ "protocol": "vless", "settings": { "address": "vpn.example.com", "port": 443 } }
]
}Конфиги и JSON лучше пересылать файлом или в блоке кода, а не обычным сообщением: так автозамена их не тронет.
Комментарии
Комментариев // и /* */ в JSON нет. Их охотно пишут в конфигах, и некоторые программы — например, VS Code в своих настройках — их понимают. Но это расширение, а не JSON: строгий парсер на комментарии падает. Если пояснение нужно сохранить, заведите для него обычное поле, например "_comment": "…".
Значения из Python и JavaScript
В JSON есть только true, false и null в нижнем регистре. Python печатает словари с True, False и None — это не JSON, хотя похоже. Так бывает, когда в лог или в ответ API попадает print(data) или str(data) вместо json.dumps(data).
Отдельный случай — NaN, Infinity и -Infinity. В JSON их нет, но json.dumps в Python по умолчанию их пишет, а JSON.stringify в JavaScript превращает в null. Из JavaScript-объектов ещё приходит undefined — его в JSON тоже нет.
{"order": 1057, "paid": True, "discount": None, "rating": NaN}{"order": 1057, "paid": true, "discount": null, "rating": null}Десятичная запятая
Дробная часть в JSON отделяется только точкой: 1.5, а не 1,5. Запятую подставляют русский Excel, выгрузки 1С и ручной ввод. В объекте {"price": 1,5} парсер сочтёт 5 началом нового ключа и упадёт. В массиве хуже: [1,5] — корректный JSON из двух чисел, 1 и 5, и ошибку никто не заметит. Если числа пришли из таблицы, проверьте разделитель ещё до того, как собирать JSON.
Незакрытая скобка и обрезанный файл
Если не хватает } или ], JSON обрывается. Причины — обрезанная строка лога, недокачанный файл, ответ нейросети, упёршийся в лимит токенов, или скобка, потерянная при ручной правке. Подробно про эту ошибку и её тексты в разных браузерах — в статье «Unexpected end of JSON input».
{"items":[{"id":1,"name":"Чай"},{"id":2,"name":"Кофе"}{"items":[{"id":1,"name":"Чай"},{"id":2,"name":"Кофе"}]}Лишний текст после JSON
Документ JSON — это ровно одно значение. Если после закрывающей скобки идёт что-то ещё, парсер сообщит об ошибке: в новых Chrome и Node.js — «Unexpected non-whitespace character after JSON», в Python — «Extra data». Обычно это:
- несколько JSON подряд — склеенные ответы или файлы;
- NDJSON (JSON Lines) — по объекту на строку, так пишут логи и выгрузки событий. Это отдельный формат: его читают построчно, а не одним
JSON.parse; - хвост после JSON: комментарий, подпись, «Готово!» в ответе нейросети.
Чтобы сделать из нескольких объектов один документ, их собирают в массив [ … ] через запятую.
Невидимые символы: BOM и переносы строк
BOM — невидимая метка в начале файла, которую добавляют некоторые редакторы для Windows и выгрузки из 1С. Стандарт запрещает её добавлять, но разрешает парсерам её игнорировать — и многие не игнорируют. JSON.parse падает на ней с «Unexpected token» в самом начале, а Python пишет «Unexpected UTF-8 BOM (decode using utf-8-sig)». Сохраните файл в UTF-8 без BOM или откройте его в Python с кодировкой utf-8-sig.
Внутри строки нельзя оставлять настоящий перенос строки, табуляцию и другие управляющие символы: их записывают как \n, \t или \u0001. Сломанные строки появляются, когда JSON собирают склейкой текста, а не через JSON.stringify или json.dumps, — например, в комментарий заказа попал многострочный адрес. Chrome пишет об этом «Bad control character in string literal». Настоящий перенос внутри строки парсер не отличит от потерянной закрывающей кавычки, поэтому наша проверка покажет на этом месте «Строка не закрыта», а дальше — каскад ошибок на следующей строке. Наша починка заменит такой перенос на \n, если дальше строка закрывается кавычкой перед запятой или скобкой; если закрывающей кавычки нет, она сочтёт документ обрезанным и закроет строку в конце — тогда проверьте результат по списку исправлений.
Повторяющиеся ключи: не ошибка, но опасно
Стандарт лишь рекомендует, чтобы ключи в объекте не повторялись, поэтому {"Цена": 87.5, "Цена": 92.0} парсеры принимают молча. JSON.parse и json.loads оставляют последнее значение, другие программы могут взять первое. Получается, что один и тот же файл в двух системах читается по-разному. Наша проверка не считает дубли ошибкой, но выводит предупреждение с номером строки.
Как найти все ошибки сразу
Парсер в браузере или Python останавливается на первой ошибке: исправили одну — получили следующую. Проверка JSON на parsetools после ошибки продолжает разбор и показывает все сломанные места списком, до 100 за раз. У каждой ошибки — строка, колонка, подчёркнутый фрагмент и объяснение по-русски: «Лишняя запятая перед ]. Уберите её», «True — это Python. В JSON пишется true». Нажатие на ошибку переводит курсор к ней.
Там же предупреждения, которые не ломают разбор, но могут подвести: повторяющиеся ключи, BOM, числа больше 2⁵³, которые JavaScript округлит. Файл не уходит на сервер: проверка работает в браузере.
Что можно починить автоматически
Большую часть ошибок из этого списка можно исправить, не гадая о смысле данных. Починка JSON:
- убирает висячие запятые и комментарии;
- заменяет одинарные и типографские кавычки на прямые двойные, берёт ключи в кавычки;
- меняет
True,False,Noneнаtrue,false,null, аNaNиundefined— наnull; - исправляет десятичную запятую
1,5на1.5; - закрывает недописанную строку и скобки обрезанного документа;
- собирает несколько JSON подряд и NDJSON в массив;
- заменяет настоящие переносы строк внутри значений на
\n, экранирует табуляцию и другие управляющие символы; - убирает текст вокруг JSON — вступление и пояснения из ответа ChatGPT или другой нейросети, ограждения ``` из Markdown.
Каждое исправление видно в списке с номером строки, так что можно убедиться, что данные не изменились. Чего починка не сделает — это не восстановит то, чего в тексте нет: потерянный конец обрезанного файла нужно получить заново.
Частые вопросы
Что значит «невалидный JSON»
Текст нарушает синтаксис JSON, и строгий парсер не может его разобрать. Чаще всего виноваты висячая запятая, одинарные или типографские кавычки, комментарии, True и None из Python или обрезанный конец.
Как найти ошибку в JSON
Вставьте текст в проверку JSON: она покажет все ошибки сразу с номером строки и колонки и объяснит причину по-русски. Нажмите на ошибку — курсор перейдёт к этому месту.
Что такое JSON parse error
Общее название ошибки разбора: программа ждала JSON, а получила текст с нарушением синтаксиса. Конкретная причина — в тексте сообщения и в позиции, на которую оно указывает.
Можно ли исправить JSON автоматически
Да, если ошибка не требует догадок: запятые, кавычки, комментарии, литералы из Python, незакрытые скобки. Починка исправит их и покажет список правок. Потерянные данные она не восстановит.
Почему JSON с комментариями работает в одной программе и не работает в другой
Некоторые программы читают расширенные варианты JSON с комментариями и висячими запятыми. Стандартный JSON их не допускает, поэтому строгий парсер на них падает.
Инструменты по теме
- Проверка Найдёт все ошибки сразу и объяснит по-русски, как их исправить
- Починка Исправит запятые, кавычки, комментарии и обрезанный конец
- Форматирование Сделает JSON читаемым с отступами и подсветит ошибки
Ещё в справке
- Unexpected token в JSON: причины и решение Unexpected token < в позиции 0 чаще всего значит, что сервер вернул HTML вместо JSON. (откроется в новой вкладке)
- Unexpected end of JSON input: что значит и как исправить Текст кончился раньше, чем JSON: пустой ответ, обрезанный файл или незакрытая скобка. (откроется в новой вкладке)
- Что такое JSON: формат, синтаксис и примеры Формат простыми словами: типы значений, правила, примеры и где он встречается. (откроется в новой вкладке)