Техподдержка

Почему JSON.parse говорит "Unexpected token"?

JSON.parse выбрасывает Unexpected token, когда текст не является допустимым JSON. Разберите одинарные кавычки, запятую в конце, HTML-ответы и позицию ошибки.

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

JSON.parse() выбрасывает SyntaxError, если вход не является допустимым JSON. «Unexpected token» обычно значит, что парсер дошёл до символа, который в этой точке структуры не разрешён.

Частые причины: одинарные кавычки, запятая в конце, имена свойств без кавычек, неверное экранирование строк, лишний текст вокруг JSON или разбор HTML либо другого не-JSON тела как JSON.

Точная формулировка ошибки зависит от движка JavaScript и браузера. Не считайте, что каждая среда печатает «Unexpected token X in JSON at position N».

Это диагностика Unexpected token у JSON.parse: что означает ошибка, как читать позицию и что делать, если тело — HTML. Запятая в конце, кавычки и Unexpected end шире разобраны в Частые ошибки JSON: запятая в конце, кавычки и Unexpected token.

Что значит “Unexpected token” в JSON.parse()?

JSON.parse() требует грамматику JSON. Недопустимый символ в текущей позиции выбрасывает SyntaxError. {“name”:“Alex”,} недопустим: после этой запятой объект не может закончиться. Текст сообщения и позиция по-прежнему зависят от среды.

Какую ошибку выбрасывает JSON.parse()?

Недопустимый JSON обычно выбрасывает SyntaxError. Журналируйте error.name, чтобы подтвердить тип. Не зашивайте целиком error.message: движки и версии формулируют его по-разному.

try {
  JSON.parse('{"name":"Alex",}');
} catch (error) {
  console.log(error.name);
  // SyntaxError
}

1. Одинарные кавычки вместо двойных

{‘name’:‘Alex’} — недопустимый JSON. {“name”:“Alex”} допустим. Строки JSON и имена членов объекта используют двойные кавычки. Литерал объекта JavaScript вроде const user = { name: ‘Alex’ } может быть законным JavaScript и всё равно не быть текстом JSON.

Недопустимо

{'name':'Alex'}

Допустимо

{"name":"Alex"}

2. Запятая в конце

Запятая после последнего свойства или последнего элемента массива недопустима в стандартном JSON. {“name”:“Alex”,“age”:30,} и [1, 2, 3,] оба падают. Считайте это одной причиной Unexpected token; Частые ошибки JSON: запятая в конце, кавычки и Unexpected token разбирает запятую в конце подробнее.

Недопустимо

{
  "name": "Alex",
  "age": 30,
}

Допустимо

{
  "name": "Alex",
  "age": 30
}
[1, 2, 3,]

3. Имена свойств без кавычек

{ name: “Alex” } может быть литералом объекта JavaScript. В JSON имена членов — строки и им нужны двойные кавычки: {“name”:“Alex”}.

Недопустимо

{
  name: "Alex"
}

Допустимо

{
  "name": "Alex"
}

4. Недопустимое экранирование строки

В тексте JSON обратная косая черта начинает escape. Сырой путь вроде C:\Users\Alex недопустим, потому что \U не является законным escape. Удвойте обратные косые. Не смешивайте экранирование языка-хозяина с экранированием JSON. Частые ошибки JSON: запятая в конце, кавычки и Unexpected token разбирает это подробнее.

Недопустимо

{"file":"C:\Users\Alex"}

Допустимо

{"file":"C:\\Users\\Alex"}

5. Лишний текст до или после JSON

JSON.parse ожидает одно значение JSON. Префикс вроде Success: перед {“ok”:true} или суффикс вроде done после него делает всю строку недопустимой. Незначащие пробелы вокруг одного значения JSON разрешены. JSON не запрещает пробелы до или после значения.

Success:
{"ok":true}
{"ok":true}
done

6. Разбор HTML вместо JSON

Вызов response.json() на HTML-странице — частый случай Unexpected token. Неверные endpoint, HTML-страницы 404 или 500, редиректы входа, тела прокси и запасные страницы часто начинаются с разметки. «Unexpected token < always means HTML» слишком сильно: < — подсказка, не доказательство.

fetch('/api/data')
  .then(response => response.json())

Что обычно значит “Unexpected token <”?

Значения JSON обычно не начинаются с <. Если тело начинается с или , < может быть первым недопустимым символом. При локальной отладке проверьте статус HTTP, Content-Type и сырое тело. Формулировка движка по-прежнему различается.

Проверьте ответ до разбора

Тело fetch можно прочитать только один раз. При локальной отладке сначала прочитайте text(), осмотрите короткий префикс, затем JSON.parse той же строки. Не вызывайте response.json(), а затем response.text() на одном ответе. По умолчанию не журналируйте чувствительные производственные данные.

const response = await fetch(url);
const text = await response.text();

console.log(response.status);
console.log(response.headers.get("content-type"));
console.log(text.slice(0, 200));

try {
  const data = JSON.parse(text);
  console.log(data);
} catch (error) {
  console.error("Invalid JSON:", error);
}

Что значит “at position 123”?

Некоторые движки сообщают позицию, строку или столбец. Ищите рядом неверную кавычку, запятую, скобку или escape. Этот индекс — место, где разбор заметил проблему; настоящая причина может быть раньше. Это не гарантия точного ошибочного символа.

Unexpected token и Unexpected end

Unexpected token значит, что парсер встретил символ, которого не ожидал. Unexpected end может появиться, когда ввод обрывается до завершения значения, как в {“name”:“Alex” без закрывающей скобки. Точная формулировка зависит от движка. Частые ошибки JSON: запятая в конце, кавычки и Unexpected token шире разбирает неполный JSON.

{"name":"Alex"

JSON — это не литерал объекта JavaScript

JSON — формат данных. Литерал объекта JavaScript — синтаксис JavaScript. Объект JS с ключами без кавычек, одинарными кавычками и запятой в конце не является допустимым текстом JSON. JSON.parse не может безопасно разобрать литералы объектов JavaScript.

const data = {
  name: 'Alex',
  active: true,
};
{
  "name": "Alex",
  "active": true
}

Может ли JSON содержать комментарии?

Стандартный JSON не поддерживает комментарии. Строка // внутри объекта недопустима. JSON5 и похожие расширения — другие форматы. Форматирование и сравнение JSON проверяет стандартный JSON через JSON.parse и не считает JSON5 за JSON.

{
  // user name
  "name": "Alex"
}

Допустимы ли в JSON undefined, NaN и Infinity?

Нет. Значения JSON — объект, массив, строка, число, true, false и null. undefined, NaN и Infinity ими не являются. Значение верхнего уровня не обязано быть объектом или массивом: true, 123, “hello” и null — допустимый JSON.

{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null

Как исправить ошибку Unexpected token по шагам

Работайте с источником, а не со строкой ошибки:

  1. Убедитесь, что вход действительно JSON, а не HTML, журналы или JavaScript.
  2. Осмотрите первые символы сырого входа.
  3. Если он пришёл из API, проверьте статус HTTP и Content-Type. Ни 200, ни application/json не гарантируют допустимый JSON.
  4. Проверьте синтаксис в JSON-парсере.
  5. Используйте указанную позицию, строку или столбец как подсказку, а не как гарантированную корневую причину.
  6. Проверьте кавычки, запятые, фигурные и квадратные скобки и escape рядом с этой областью.
  7. Сравните с отформатированной, проверенной копией.
  8. Исправьте сериализатор или endpoint. Не удаляйте указанный токен наугад.
Не «чините» JSON случайной заменой кавычек

Глобальная замена ' на " может сломать апострофы внутри строк, уже экранированный текст и источники, которые не JSON. Получайте допустимый JSON из настоящего сериализатора. Не считайте eval JSON-парсером.

Используйте JSON.stringify() при создании JSON в JavaScript

Предпочитайте JSON.stringify ручной склейке строк. Он выдаёт допустимый текст JSON для сериализуемых значений. Он не сохраняет каждое значение JavaScript: у undefined, функций и символов особое поведение. Эта деталь здесь вне темы.

const data = {
  name: "Alex",
  active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}

Недопустимый JSON и настоящее исправление

Эти пары проверены через JSON.parse. Для HTML исправление — ответ, а не правка синтаксиса.

Проблема Недопустимо Исправление
Одинарные кавычки {'a':1} {"a":1}
Запятая в конце {"a":1,} {"a":1}
Ключ без кавычек {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
Тело HTML <html>... Проверьте endpoint и сырой ответ. Не правьте HTML, превращая его в JSON.

Простая схема решения для Unexpected token

Если JSON.parse не удался, сначала решите, есть ли у вас вообще JSON, прежде чем переписывать кавычки.

  • JSON.parse не удался
  • Из API? Проверьте статус, Content-Type и сырое тело
  • Начинается как JSON? Если нет, исправьте источник или endpoint
  • Если да, проверьте кавычки, запятые, скобки, escape, неподдерживаемые значения
  • Используйте указанную позицию как подсказку
  • Исправьте источник, затем разберите снова
Unexpected token называет сюрприз. Источник текста часто и есть настоящее исправление.

Проверяйте JSON до разбора и использования

NEXNARA Форматирование и сравнение JSON проверяет JSON в браузере через JSON.parse—не eval.

Проверка, красивая печать с 2 пробелами, 4 пробелами или табуляцией, минификация, копирование, скачивание и загрузка .json. JSON Diff охватывает вложенные объекты и массивы, пути, сводку, фильтры и обмен. После разбора красивая и минифицированная копии тех же данных сравниваются как равные; ключи объектов сравниваются по имени.

Текст больше 5 MB может ощущаться медленным. Текст больше 15 MB в браузере не обрабатывается.

Проверка и форматирование JSON происходят в вашем браузере. Этот инструмент не отправляет JSON на сервер NEXNARA. Реклама и другие функции сайта по-прежнему используют сеть.

Вставьте строку, которая падает, в Форматирование и сравнение JSON и прочитайте первые символы, прежде чем переписывать кавычки.

FAQ

Почему JSON.parse говорит Unexpected token?

Текст не является допустимым JSON в точке, где парсер остановился. Типичные причины: кавычки, запятые, лишний текст или тело не-JSON, например HTML.

Что значит Unexpected token < in JSON?

Первым недопустимым символом может быть <. Это часто указывает на HTML-страницу, но не доказывает 404 и не доказывает HTML в каждом случае. Проверьте статус, Content-Type и сырое тело.

Как найти позицию ошибки в JSON?

Если движок сообщает позицию, строку или столбец, смотрите рядом. Настоящая ошибка может быть раньше. Используйте это как подсказку, затем проверьте.

Может ли JSON использовать одинарные кавычки?

Нет. В стандартном JSON строки и имена членов используют двойные кавычки.

Может ли JSON иметь запятую в конце?

Нет. Стандартный JSON не допускает запятую после последнего свойства или последнего элемента массива.

Как проверить, что строка — допустимый JSON?

Вызовите JSON.parse в try/catch или вставьте текст в Форматирование и сравнение JSON. Если разбор выбрасывает SyntaxError, строка не является допустимым JSON.

Техподдержка

Частые ошибки JSON: запятая в конце, кавычки и Unexpected token

Исправьте невалидный JSON: конечная запятая, одинарные кавычки, ключи без кавычек и Unexpected token. Почему падает JSON.parse.

Техподдержка

JPG vs PNG для скриншотов: какой меньше?

Выбирайте JPG или PNG для скриншотов по содержимому: UI и текст часто остаются чётче как PNG; кадры с большим количеством фото могут быть меньше как JPEG.

Техподдержка

Как уменьшить файл изображения, чтобы оно не стало размытым

Уменьшайте размер фото и изображений, сохраняя приемлемое качество. Сначала уменьшите лишние пиксели, затем умеренно сожмите и выберите подходящий формат.

Техподдержка

Unix Timestamp в дату: секунды, миллисекунды и UTC

Переведите Unix timestamp в дату. Секунды против миллисекунд, UTC против местного времени, ISO 8601 и обратный путь от даты к epoch-времени.

Техподдержка

Почему Base64 делает файлы больше?

Base64 обычно увеличивает двоичные данные примерно на треть. Смотрите структуру 3 байта → 4 символа, дополнение, лишний размер Data URL и когда этот прирост оправдан.