Unexpected end of JSON input: почему JSON обрывается
Ошибка значит, что разбор дошёл до конца текста, а JSON не закончен. Чаще всего ответ просто пустой, реже его обрезали по дороге.
Что означает ошибка
JSON.parse дочитал строку до конца, а значение не закрыто: строка пустая, не хватает закрывающей скобки или кавычки. Chrome и Node.js пишут Unexpected end of JSON input, Firefox — JSON.parse: unexpected end of data. Валидатор покажет, на каком символе текст оборвался.
Пустой ответ и response.json()
Самая частая причина — вызов response.json() на ответе без тела: 204 No Content, 201 без данных, 500 с пустым телом или ответ на HEAD. Сначала прочитайте текст и проверьте код ответа, а разбирайте JSON, только если текст не пустой.
const res = await fetch('/api/orders/1042');
const text = await res.text(); // сначала текст, а не res.json()
if (!res.ok) throw new Error(res.status + ': ' + text);
const data = text ? JSON.parse(text) : null; // пустой ответ — не ошибка JSONЕсли JSON обрезан
Ответ обрывается, когда прокси закрывает соединение по таймауту, срабатывает лимит размера или падает сервис. Ещё один источник — копирование из логов: многие системы обрезают длинные строки. Сравните фактическую длину тела с заголовком Content-Length и посмотрите, чем заканчивается ответ.
curl -s -D - https://api.example.com/orders -o body.json
wc -c body.jsonКак не пропускать это в тестах
Проверяйте код ответа и то, что тело не пустое, раньше, чем значения полей. Тогда отчёт скажет «пришёл 204 без тела» вместо невнятной ошибки разбора. В Checkcraft это отдельные правила на код и на наличие полей.
Повторите это на своём API
Checkcraft — настольная программа: сохраняет проверки ответа API без кода и показывает, что не совпало. Начните с учебного примера, затем подставьте свои обезличенные данные. Free работает на Windows и Linux без ограничения срока.
Скачать FreeКак получить и запустить приложениеСкачивание без регистрации и почты, архив готов за пару минут. Состав бесплатной версии опубликован на странице тарифов.
Документация
Начните с примера по ссылкам и сопоставьте результат с требованием своей проверки.