JavaScript LinuxWindowsmacOS

JavaScript — SyntaxError: Unexpected end of JSON input

  • Обновлено
  • Чтение ≈ 5 минут

Краткий ответ

Ошибка «SyntaxError: Unexpected end of JSON input» означает, что JSON.parse получил пустую или оборванную строку. Проверьте ответ сервера, статус и тело, обработку пустых ответов, кодировку и закрытие файла, не разбирайте текст до проверки ok и Content-Type.

В этой статье
  1. Что это значит
  2. Причины
  3. Порядок
  4. На сервере
Unexpected end of JSON input
Uncaught SyntaxError: Unexpected end of JSON input / Unexpected token < in JSON at position 0
По-русскиJSON.parse получил пустую строку или обрезанный текст.

#Что это значит

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.

#Порядок

  1. Выведите сырой текст ответа перед разборомВ редакторе кода откройте участок, где вызывается JSON.parse(...) или response.json(). Ошибка «Unexpected end» обычно означает, что передан пустой/обрезанный текст. Для запроса fetch временно замените один вызов response.json() на const text = await response.text(); console.log(text); (тело ответа читается только один раз). В консоли браузера (F12 → «Console») посмотрите, пустая ли строка и где обрывается JSON. Не выводите в журналы токены и персональные данные на рабочем сайте.
  2. Проверьте код состоянияОткройте инструменты разработчика браузера клавишей F12 → «Network/Сеть» → выберите проблемный запрос. На вкладке «Headers/Заголовки» прочитайте Status Code и Content-Type, затем «Response/Ответ». 204 No Content и 205 Reset Content не содержат JSON, 4xx/5xx могут отдавать HTML или пустое тело. Исправляйте обработку соответствующего ответа, а не добавляйте закрывающую скобку вслепую.
  3. Проверьте вкладку Network в инструментах разработчика: размер ответа иВо вкладке «Сеть» включите «Сохранить журнал», воспроизведите ошибку, нажмите на нужный запрос. Проверьте размер ответа, вкладку «Ответ» и не оборвалось ли соединение; нажмите правой кнопкой → «Копировать» → «Копировать ответ» (названия могут отличаться). Если ответ обрывается посередине строки, проверьте ошибки серверного приложения и обратного прокси за это же время; JavaScript не может восстановить недополученные данные.
  4. Обработайте пустой ответ и код 204В коде клиента обработайте отсутствие тела отдельно: после fetch проверьте response.status === 204 || response.status === 205, а до JSON.parse — что текст не пустой после trim(). В приведённом ниже примере функция возвращает null при пустом разрешённом ответе и выбрасывает осмысленную ошибку при неверном JSON. Вызывающий код должен уметь обрабатывать null; не объявляйте всякую пустую строку корректным результатом.
  5. Проверьте сервер: он должен отдавать корректный JSON даже при ошибке,Если вы управляете сервером, найдите обработчик указанного адреса API. Убедитесь, что успешный ответ с JSON имеет Content-Type: application/json и заканчивается полноценным json_encode/аналогом, а ответ без тела использует корректный код, например 204. При ошибке сервера обеспечьте контролируемый код состояния и понятное сообщение; проверьте логи PHP/Node.js на исключения. Обычному посетителю сервиса достаточно сообщить владельцу код ответа и время сбоя.
  6. Для файлов проверьте, что запись завершена и файл не пустЕсли JSON читается из файла, откройте его копию в редакторе и проверьте последние символы: объект должен завершаться }, массив — ]. Для локального файла в терминале выполните python3 -m json.tool data.json (или python -m json.tool data.json в Windows), указав фактический путь. Команда покажет строку и позицию синтаксической ошибки; если файл нулевой длины, выясните, завершилась ли запись. Не перезаписывайте исходник до резервного копирования.
  7. Для localStorage проверяйте значение перед JSON.parseПри чтении localStorage сначала вызовите localStorage.getItem('ключ'): если ключ отсутствует, вернётся null, и разбирать нечего. Для текстового JSON применяйте try/catch вокруг JSON.parse и задавайте запасное значение. Если данные имеют прикладную ценность, перед удалением повреждённой записи сохраните её текст в файл и выясните, почему приложение записало неполную строку.
  8. Проверьте CORS и прокси: иногда вместо JSON приходит HTMLЕсли вместо JSON приходит HTML, проверьте точный URL запроса, перенаправление на страницу входа, прокси и серверные ошибки по вкладкам «Headers» и «Response». CORS-ошибки смотрите в «Console»: браузер может вообще не предоставить JS доступ к ответу. Исправление CORS производится на сервере-владельце API, а не отключением безопасности браузера. После исправления убедитесь, что тело ответа действительно полный JSON.
  9. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Безопасный разбор ответа fetch: статус, пустое тело, ошибка разбора
    JavaScriptКоманда
    Безопасный разбор ответа fetch: статус, пустое тело, ошибка разбора
    async function getJson(url) {
    const response = await fetch(url);
    const text = await response.text();
    if (!response.ok) {
    throw new Error(`HTTP ${response.status}: ${text.slice(0, 200)}`);
    }
    if (!text.trim()) return null; // пустой ответ (например, 204)
    try {
    return JSON.parse(text);
    } catch (e) {
    console.error('Не JSON:', text.slice(0, 200));
    throw e;
    }
    }
    Вариант 2Чтение из localStorage с защитой от пустого значения
    JavaScriptКоманда
    Чтение из localStorage с защитой от пустого значения
    function readJson(key, fallback = null) {
    const raw = localStorage.getItem(key);
    if (!raw) return fallback;
    try { return JSON.parse(raw); } catch { return fallback; }
    }
    Вариант 3Проверить ответ сервера из консоли: код ответа, заголовки и тело
    Linux · Терминал (Bash)Команда
    Проверить ответ сервера из консоли: код ответа, заголовки и тело
    curl -i https://example.ru/api/items
    curl -s https://example.ru/api/items | python3 -m json.tool
    Вариант 4Проверить файл JSON на корректность
    Linux · Терминал (Bash)Команда
    Проверить файл JSON на корректность
    python3 -m json.tool data.json > /dev/null && echo "JSON корректен"
    wc -c data.json

#На сервере

Убедитесь, что все ветки кода возвращают JSON: даже в случае ошибки отправляйте {"error": "..."} с кодом 4xx/5xx и Content-Type: application/json. В Node.js (Express) вызывайте res.json() или res.status(204).end() без тела. В PHP не выводите ничего, кроме JSON (никаких лишних пробелов, BOM и предупреждений до json_encode).

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.