How to Fix Invalid JSON: Common Errors & Solutions
Diagnose and fix the 10 most common JSON errors developers encounter. Each error includes before/after code examples and a clear explanation of why it happens.
Почему парсинг JSON не удается
JSON выглядит просто — и это так — но его строгость именно то, что сбивает людей с толку. В отличие от литералов объектов JavaScript, JSON не допускает никаких синтаксических сокращений. Никаких завершающих запятых. Никаких одинарных кавычек. Никаких комментариев. Каждое отклонение вызывает ошибку парсинга, а сообщения об ошибках часто не помогают: Неожиданный токен или JSON.parse: ожидался ',' или '}' на строке 1.
Этот гид охватывает 10 самых распространенных ошибок JSON, с которыми разработчики сталкиваются в реальной жизни. Каждая ошибка включает в себя сломанный JSON, причину, по которой парсер отклоняет его, и исправленную версию. Добавьте эту страницу в закладки — вы вернетесь к ней.
Попробуйте сами: Вставьте сломанный JSON в наш JSON Repair инструмент, чтобы автоматически исправить большинство этих ошибок мгновенно.
Ошибка 1: Завершающая запятая
Это самая распространенная ошибка JSON. JavaScript позволяет завершающие запятые в объектах и массивах, поэтому разработчики естественно пишут JSON так же. Но JSON не допускает их.
Сломанный:
{
"name": "Alice",
"age": 30,
}
Исправленный:
{
"name": "Alice",
"age": 30
}
Завершающая запятая после 30 заставляет парсер ожидать еще одну пару ключ-значение. Когда он находит вместо этого закрывающую фигурную скобку, он выдает ошибку. Удалите запятую после последнего элемента в каждом объекте и массиве.
Ошибка 2: Одинарные кавычки вместо двойных
JSON требует двойные кавычки как для ключей, так и для строковых значений. Одинарные кавычки — это особенность JavaScript, которую парсер JSON отклоняет.
Сломанный:
{
'name': 'Alice',
'city': 'Portland'
}
Исправленный:
{
"name": "Alice",
"city": "Portland"
}
Это происходит чаще всего, когда копируют литералы объектов из кода JavaScript или из словарей Python (которые также используют одинарные кавычки). Замена ' на " исправляет это, но будьте осторожны со строками, содержащими апострофы — их нужно экранировать.
Ошибка 3: Некотируемые ключи
JavaScript позволяет писать { name: "Alice" } без кавычек вокруг ключа. JSON этого не допускает. Каждый ключ должен быть строкой в двойных кавычках.
Сломанный:
{
name: "Alice",
age: 30
}
Исправленный:
{
"name": "Alice",
"age": 30
}
Это обычно возникает, когда кто-то вручную пишет JSON или копирует объект JavaScript, не конвертируя его. Некоторые редакторы и инструменты отладки API с удовольствием отображают некотируемые ключи, скрывая проблему до тех пор, пока вы не попытаетесь разобрать файл в другом месте.
Ошибка 4: Комментарии в JSON
JSON не поддерживает комментарии — ни // однострочные, ни /* */ блочные комментарии. Это одно из самых разочаровывающих ограничений формата, особенно для конфигурационных файлов.
Сломанный:
{
// Настройки базы данных
"host": "localhost",
"port": 5432 /* порт по умолчанию PostgreSQL */
}
Исправленный:
{
"host": "localhost",
"port": 5432
}
Если вам нужны комментарии в конфигурационных файлах, рассмотрите возможность использования JSONC (JSON с комментариями), который поддерживается VS Code и TypeScript, или переключитесь на YAML или TOML. Для стандартного JSON удалите все комментарии перед парсингом.
Ошибка 5: Отсутствующая запятая между элементами
При добавлении нового поля в объект JSON легко забыть запятую, разделяющую его с предыдущим полем. Парсер видит два последовательных значения без разделителя и зависает.
Сломанный:
{
"name": "Alice"
"age": 30
}
Исправленный:
{
"name": "Alice",
"age": 30
}
Сообщение об ошибке обычно указывает на строку после отсутствующей запятой, что может быть вводящим в заблуждение. Если вы видите Неожиданная строка или Ожидалась запятая, посмотрите на строку выше указанной позиции.
Ошибка 6: Отсутствующая закрывающая скобка или фигурная скобка
Несоответствующие скобки трудно заметить в больших JSON-файлах. Отсутствующая ] или } заставляет парсер читать за пределами предполагаемого конца структуры, производя запутанные ошибки далеко от фактической проблемы.
Сломанный:
{
"users": [
{ "name": "Alice" },
{ "name": "Bob" }
}
Исправленный:
{
"users": [
{ "name": "Alice" },
{ "name": "Bob" }
]
}
Исправление: используйте редактор с сопоставлением скобок (VS Code выделяет соответствующие пары) или JSON Validator, который сообщает точное местоположение несоответствия.
Ошибка 7: undefined, NaN или Infinity
Это допустимые значения JavaScript, но у них нет представления в JSON. JSON.stringify безмолвно преобразует undefined в null (или полностью опускает ключ), но если вы вручную пишете эти значения, парсер отклоняет их.
Сломанный:
{
"score": NaN,
"callback": undefined,
"limit": Infinity
}
Исправленный:
{
"score": null,
"callback": null,
"limit": null
}
Замените undefined и NaN на null, или полностью опустите ключ, если отсутствие значения семантически уместно. Для Infinity рассмотрите возможность использования сигнального числа или строкового представления, такого как "Infinity", и обрабатывайте это в вашем коде приложения.
Ошибка 8: Лишняя запятая после последнего элемента массива
Это версия ошибки 1 для массивов. Она постоянно появляется в вручную редактируемых JSON-файлах, особенно после удаления или изменения порядка элементов.
Сломанный:
{
"colors": [
"red",
"green",
"blue",
]
}
Исправленный:
{
"colors": [
"red",
"green",
"blue"
]
}
Шаблон тот же: запятая после "blue" говорит парсеру ожидать еще один элемент. Он находит ] вместо этого и сообщает об ошибке. При удалении элементов из массива JSON всегда проверяйте, есть ли у нового последнего элемента завершающая запятая.
Ошибка 9: Умные кавычки (кривые кавычки)
Эта ошибка коварна. Когда вы копируете JSON из документа Word, сообщения Slack или блога, ваша система может незаметно заменить прямые кавычки (") на типографские "умные" кавычки (\u201C и \u201D). Они выглядят почти идентично, но это совершенно разные символы.
Сломанный:
{
\u201Cname\u201D: \u201CAlice\u201D,
\u201Ccity\u201D: \u201CPortland\u201D
}
Исправленный:
{
"name": "Alice",
"city": "Portland"
}
Сообщение об ошибке обычно Неожиданный токен на позиции 1 или 2, что сбивает с толку, пока вы не осознаете, что символы кавычек неправильные. Исправление: замените все кривые кавычки на прямые двойные кавычки. В крайнем случае, введите кавычки вручную в текстовом редакторе.
Чтобы этого избежать, всегда используйте редактор кода (а не редактор с богатым текстом) для написания JSON. Отключите "умные кавычки" в настройках клавиатуры вашей ОС, если вы часто вставляете текст между приложениями.
Ошибка 10: Символы BOM (Byte Order Mark)
BOM — это невидимый символ (U+FEFF), который некоторые текстовые редакторы Windows вставляют в начале файла для указания кодировки. Парсеры JSON видят его как неожиданный символ перед открывающей фигурной скобкой и сразу же выдают ошибку.
Симптомы:
SyntaxError: Неожиданный токен \uFEFF в JSON на позиции 0
Вы не можете увидеть BOM в большинстве редакторов — он действительно невидим. Чтобы обнаружить его, откройте файл в шестнадцатеричном редакторе и найдите байты EF BB BF (UTF-8 BOM) в самом начале.
Как исправить:
- В VS Code нажмите на индикатор кодировки в строке состояния и выберите "Сохранить с кодировкой" → "UTF-8" (без BOM).
- В командной строке:
sed -i '1s/^\xEF\xBB\xBF//' file.json - В Node.js удалите его перед парсингом:
const clean = text.replace(/^\\uFEFF/, "");
Быстрая справка: Все 10 ошибок
| # | Ошибка | Причина | Исправление |
|---|---|---|---|
| 1 | Завершающая запятая | Запятая после последнего свойства/элемента | Удалите завершающую запятую |
| 2 | Одинарные кавычки | Использованы ' вместо " | Замените на двойные кавычки |
| 3 | Некотируемые ключи | Ключи без двойных кавычек | Оберните все ключи в двойные кавычки |
| 4 | Комментарии | // или /* */ в JSON | Удалите все комментарии |
| 5 | Отсутствующая запятая | Нет запятой между элементами | Добавьте запятую между элементами |
| 6 | Отсутствующая скобка/фигурная скобка | Не закрыты [ или { | Добавьте отсутствующий закрывающий символ |
| 7 | undefined / NaN / Infinity | Значения только для JS в JSON | Замените на null или строку |
| 8 | Лишняя запятая в массиве | Завершающая запятая в массиве | Удалите завершающую запятую |
| 9 | Умные кавычки | Кривые кавычки из Word/Slack | Замените на прямые двойные кавычки |
| 10 | Символ BOM | Невидимый U+FEFF в начале файла | Сохраните как UTF-8 без BOM |
Предотвращение ошибок JSON
Исправление ошибок — это хорошо. Не создавать их с самого начала — еще лучше. Вот привычки, которые помогут сохранить JSON в чистоте:
- Никогда не пишите JSON вручную. Генерируйте его из кода с помощью
JSON.stringifyили эквивалента вашего языка. Сериализаторы по определению производят допустимый JSON. - Используйте редактор, осознающий JSON. VS Code, IDE JetBrains и Sublime Text все выделяют ошибки синтаксиса JSON в реальном времени. Если вы видите красную волнистую линию, исправьте это перед сохранением.
- Проверяйте в CI. Добавьте шаг проверки в ваш конвейер сборки, который парсит все JSON-файлы и завершает работу при ошибках. Одна строка скрипта оболочки делает это:
find . -name "*.json" -exec python -m json.tool {} \\; - Используйте JSONC для конфигурации. Если вам нужны комментарии, используйте JSONC (
.jsoncрасширение), где это поддерживается. TypeScript, VS Code и многие другие инструменты обрабатывают это нативно.
Когда использовать автоматическое исправление
Иногда JSON, который вы получаете, находится вне вашего контроля — ответ API от плохо построенной службы, файл, экспортированный устаревшим программным обеспечением, или фрагмент, вставленный не техническим членом команды. В этих случаях ручное исправление утомительно и подвержено ошибкам.
Инструменты автоматического исправления могут исправить большинство перечисленных выше ошибок за один проход. Они парсят сломанный ввод, выводят предполагаемую структуру и производят допустимый JSON. Это хорошо работает для распространенных проблем, таких как завершающие запятые, одинарные кавычки и некотируемые ключи.
Недостаток в том, что автоматическое исправление делает предположения. Если JSON сильно искажен — отсутствуют большие секции или структура неоднозначна — инструмент может ошибиться. Всегда проверяйте исправленный вывод перед использованием его в производстве.
Попробуйте сами: Вставьте сломанный JSON в наш JSON Repair инструмент, чтобы автоматически исправить распространенные ошибки, или используйте JSON Validator, чтобы точно определить, где проблема.