Техподдержка
Почему 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 по шагам
Работайте с источником, а не со строкой ошибки:
- Убедитесь, что вход действительно JSON, а не HTML, журналы или JavaScript.
- Осмотрите первые символы сырого входа.
- Если он пришёл из API, проверьте статус HTTP и Content-Type. Ни 200, ни application/json не гарантируют допустимый JSON.
- Проверьте синтаксис в JSON-парсере.
- Используйте указанную позицию, строку или столбец как подсказку, а не как гарантированную корневую причину.
- Проверьте кавычки, запятые, фигурные и квадратные скобки и escape рядом с этой областью.
- Сравните с отформатированной, проверенной копией.
- Исправьте сериализатор или endpoint. Не удаляйте указанный токен наугад.
Глобальная замена ' на " может сломать апострофы внутри строк, уже экранированный текст и источники, которые не 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, неподдерживаемые значения
- Используйте указанную позицию как подсказку
- Исправьте источник, затем разберите снова
Проверяйте 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.