Ошибки JSON, из-за которых чаще всего не разбирается файл, и как их исправить
Большинство ошибок разбора JSON вызваны небольшим набором ошибок: запятой после последнего элемента, строкой в одинарных кавычках, комментарием, ключом без кавычек, значением вроде NaN или undefined или «умными» кавычками, скопированными из документа. JSON строже JavaScript, на который он похож, поэтому код, который человеку кажется правильным, парсер может отклонить. Сообщение об ошибке указывает строку и столбец, и исправление обычно находится в этой позиции или непосредственно перед ней.
Форматирование JSONJSON не разбираетсяСделать бесплатноПравила, которые требует JSON
Документ JSON — это одно значение: объект в фигурных скобках, массив в квадратных скобках, строка, число, true, false или null. Внутри этих значений:
- Каждый ключ и каждая строка заключены в прямые двойные кавычки, например "name".
- Запятые разделяют элементы, и после последнего элемента объекта или массива запятой быть не должно.
- Числа не могут начинаться с плюса, а NaN, Infinity и undefined не являются допустимыми числами или значениями.
- Комментарии не допускаются вовсе.
- Ключи должны быть строками, поэтому ключ без кавычек, например name:, недопустим.
Некоторые парсеры принимают часть этих правил по умолчанию, а некоторые инструменты допускают JSON с комментариями для удобства. Эта снисходительность скрывает проблему до тех пор, пока файл не попадёт к более строгому читателю, поэтому пишите строгую форму.
Как читать сообщение об ошибке
Парсер сообщает о первом месте, где он не смог продолжить. Сообщение называет проблему и даёт позицию, обычно строку и столбец. Вот небольшой файл с запятой в конце массива и ещё одной после последнего свойства:
{
"name": "Ada",
"tags": ["a", "b",],
}
Python выводит для этого сообщение «Illegal trailing comma before end of array: line 3 column 20». Формулировки различаются у разных инструментов, а некоторые старые парсеры пишут только «Unexpected token» со смещением символа. Перейдите к указанной позиции, затем посмотрите на символ прямо перед ней. Настоящая ошибка часто оказывается запятой, кавычкой или скобкой на один-два символа раньше указанного места.
Несколько других сообщений парсера Python и что они обычно означают:
- «Expecting property name enclosed in double quotes» для '{'a': 1}' означает ключ в одинарных кавычках или без кавычек.
- «Expecting value» в позиции, где вы ожидали число или строку, часто означает «умную» кавычку: парсер воспринимает её как неизвестный символ.
- «Expecting ',' delimiter» обычно означает пропущенную запятую между двумя элементами или комментарий внутри данных.
«Умные» кавычки и скопированный текст
«Умные» кавычки — самый запутанный случай, потому что они почти неотличимы от прямых. Файл JSON, скопированный из текстового редактора, веб-страницы или сообщения в чате, может содержать изогнутые двойные кавычки. Файл вам кажется правильным, но не разбирается, потому что парсер видит “x” как неизвестный символ, а не как ограничитель строки.
Скрытые символы вызывают ту же ошибку. Неразрывный пробел между двумя значениями для парсера не является пробелом. Удалите скрытые символы перед тем, как вручную исправлять структуру, а затем исправьте кавычки. Статья о том, как выпрямить кавычки в коде, объясняет, как сделать это безопасно.
Одинарные кавычки, комментарии и ключи без кавычек
Многие разработчики пишут данные, похожие на JSON, на языке, который допускает больше:
- Одинарные кавычки допустимы в литералах JavaScript и Python, но JSON требует двойных кавычек. Замените {'a': 1} на {"a": 1}.
- Комментарии вида
//или/* */нужно удалить. Если нужны пометки, вынесите их в отдельное поле или используйте формат, созданный для конфигурационных файлов. - Ключи без кавычек часто встречаются в объектных литералах JavaScript. Добавьте кавычки.
- NaN и undefined — это не JSON. Для отсутствующего значения используйте null, а если значение — текст, строку.
Будьте осторожны с заменой всех кавычек подряд. Если заменить каждую одинарную кавычку на двойную, сломается любая строка, содержащая апостроф, например "Ada's notes". Сначала просмотрите все совпадения в поиске и замене, чтобы увидеть, какие кавычки будут изменены.
Исправляем структуру по шагам
- Вставьте файл в форматирование JSON. Форматирование делает структуру видимой, а ошибка показывает строку и столбец. Затем нажмите Исправить: инструмент удалит комментарии и запятые в конце. Одинарные и «умные» кавычки он не меняет, их придётся исправить самостоятельно.
- Исправьте только первую ошибку и проверьте файл снова: одна ошибка может породить несколько последующих.
- Проверьте, что у каждой открывающей фигурной или квадратной скобки есть закрывающая и что вложенность такая, как вы задумали.
- Проверьте итоговый файл парсером, который использует ваше приложение, а не только веб-инструментом. Парсеры немного отличаются.
Файл, который разбирается, не обязательно тот файл, который вы хотели. Проверьте его по JSON Schema, чтобы найти пропущенное поле или значение неверного типа, или сравните два документа JSON, чтобы увидеть, что изменилось между версиями.
Особые случаи
- Запятые в конце в сгенерированных файлах. Некоторые инструменты их записывают. Если вы собираете JSON вручную из строк, используйте сериализатор вашего языка, который выдаёт корректный результат.
- Повторяющиеся ключи. JSON их допускает, но большинство парсеров сохраняет только последнее значение. Повторяющиеся ключи — ошибка, которая ждёт своего часа.
- Большие числа. Очень большие целые числа могут терять точность в некоторых парсерах, поэтому храните идентификаторы как строки, если они длиннее, чем парсер способен точно представить. Руководство по конвертации CSV в JSON говорит то же самое об ID.
Краткие ответы
Почему мой JSON не разбирается, хотя выглядит правильно?
Обычные причины — запятая в конце, одинарные кавычки, комментарий или «умные» кавычки, скопированные из документа. Проверьте позицию в сообщении об ошибке и символ прямо перед ней.
Может ли JSON содержать комментарии?
Нет. Стандарт JSON не допускает комментариев. Удалите их или вынесите пометки в отдельное поле. Кнопка Исправить в форматировании JSON удалит их за вас.
Что использовать вместо undefined в JSON?
Используйте null, когда значение намеренно отсутствует, или полностью уберите ключ. undefined — это значение JavaScript, у которого нет представления в JSON.
Переведено с помощью ИИ с Английский оригинал.
Комментарии
Комментариев пока нет. Будьте первым.


