Uncaught SyntaxError: Unexpected end of JSON input / Unexpected token < in JSON at position 0
#Что это значит
Unexpected end of JSON input выбрасывает JSON.parse или response.json(), когда строка закончилась до конца значения: пустая строка "", обрезанный ответ или файл. Это не ошибка синтаксиса в середине, а отсутствие данных. Типичные ситуации: сервер вернул пустое тело (код 204, ошибка 500 без тела), запрос завершился прерыванием, файл JSON пустой или записывался параллельно, в localStorage лежит пустая строка, и приложение пытается её разобрать.
#Причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Пустой ответ сервераКод 204 или ошибка 500. | Тело длиной 0. | Проверьте статус и пустое тело. |
| Ответ оборванТаймаут, обрыв. | Часть JSON. | Проверьте сеть и размер. |
| HTML вместо JSONСтраница ошибки или редирект. | Unexpected token '<'. | Проверьте адрес и авторизацию. |
| Пустой файлЗапись не завершена. | Размер 0 байт. | Запись атомарно (временный файл и переименование). |
| Пустое значение в localStorageНет данных. | JSON.parse(''). | Проверка перед разбором. |
| Ошибка CORS или проксиБлокировка. | Пустой ответ в режиме no-cors. | Настройте CORS. |
#Порядок
- Выведите сырой текст ответа перед разборомВ редакторе кода откройте участок, где вызывается
JSON.parse(...)илиresponse.json(). Ошибка «Unexpected end» обычно означает, что передан пустой/обрезанный текст. Для запросаfetchвременно замените один вызовresponse.json()наconst text = await response.text(); console.log(text);(тело ответа читается только один раз). В консоли браузера (F12 → «Console») посмотрите, пустая ли строка и где обрывается JSON. Не выводите в журналы токены и персональные данные на рабочем сайте. - Проверьте код состоянияОткройте инструменты разработчика браузера клавишей F12 → «Network/Сеть» → выберите проблемный запрос. На вкладке «Headers/Заголовки» прочитайте
Status CodeиContent-Type, затем «Response/Ответ».204 No Contentи205 Reset Contentне содержат JSON,4xx/5xxмогут отдавать HTML или пустое тело. Исправляйте обработку соответствующего ответа, а не добавляйте закрывающую скобку вслепую. - Проверьте вкладку Network в инструментах разработчика: размер ответа иВо вкладке «Сеть» включите «Сохранить журнал», воспроизведите ошибку, нажмите на нужный запрос. Проверьте размер ответа, вкладку «Ответ» и не оборвалось ли соединение; нажмите правой кнопкой → «Копировать» → «Копировать ответ» (названия могут отличаться). Если ответ обрывается посередине строки, проверьте ошибки серверного приложения и обратного прокси за это же время; JavaScript не может восстановить недополученные данные.
- Обработайте пустой ответ и код 204В коде клиента обработайте отсутствие тела отдельно: после
fetchпроверьтеresponse.status === 204 || response.status === 205, а доJSON.parse— что текст не пустой послеtrim(). В приведённом ниже примере функция возвращаетnullпри пустом разрешённом ответе и выбрасывает осмысленную ошибку при неверном JSON. Вызывающий код должен уметь обрабатыватьnull; не объявляйте всякую пустую строку корректным результатом. - Проверьте сервер: он должен отдавать корректный JSON даже при ошибке,Если вы управляете сервером, найдите обработчик указанного адреса API. Убедитесь, что успешный ответ с JSON имеет
Content-Type: application/jsonи заканчивается полноценнымjson_encode/аналогом, а ответ без тела использует корректный код, например 204. При ошибке сервера обеспечьте контролируемый код состояния и понятное сообщение; проверьте логи PHP/Node.js на исключения. Обычному посетителю сервиса достаточно сообщить владельцу код ответа и время сбоя. - Для файлов проверьте, что запись завершена и файл не пустЕсли JSON читается из файла, откройте его копию в редакторе и проверьте последние символы: объект должен завершаться
}, массив —]. Для локального файла в терминале выполнитеpython3 -m json.tool data.json(илиpython -m json.tool data.jsonв Windows), указав фактический путь. Команда покажет строку и позицию синтаксической ошибки; если файл нулевой длины, выясните, завершилась ли запись. Не перезаписывайте исходник до резервного копирования. - Для localStorage проверяйте значение перед JSON.parseПри чтении
localStorageсначала вызовитеlocalStorage.getItem('ключ'): если ключ отсутствует, вернётсяnull, и разбирать нечего. Для текстового JSON применяйтеtry/catchвокругJSON.parseи задавайте запасное значение. Если данные имеют прикладную ценность, перед удалением повреждённой записи сохраните её текст в файл и выясните, почему приложение записало неполную строку. - Проверьте CORS и прокси: иногда вместо JSON приходит HTMLЕсли вместо JSON приходит HTML, проверьте точный URL запроса, перенаправление на страницу входа, прокси и серверные ошибки по вкладкам «Headers» и «Response». CORS-ошибки смотрите в «Console»: браузер может вообще не предоставить JS доступ к ответу. Исправление CORS производится на сервере-владельце API, а не отключением безопасности браузера. После исправления убедитесь, что тело ответа действительно полный JSON.
- Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#На сервере
Убедитесь, что все ветки кода возвращают JSON: даже в случае ошибки отправляйте {"error": "..."} с кодом 4xx/5xx и Content-Type: application/json. В Node.js (Express) вызывайте res.json() или res.status(204).end() без тела. В PHP не выводите ничего, кроме JSON (никаких лишних пробелов, BOM и предупреждений до json_encode).