Как исправить неверный JSON: 7 ошибок, которые ломают каждый парсер
Анализ JSON кажется тривиальным, пока один случайный символ не сломает вашу сборку за пять минут до развертывания. JSON намеренно строгий, более строгий, чем JavaScript, и именно поэтому разработчики, пришедшие на JS, постоянно попадают в ловушку. Хорошей новостью является то, что почти каждая ошибка «неверный JSON» является одной из семи распространенных ошибок. Научитесь их распознавать, и большинство неработающих JSON находятся на расстоянии одного символа от допустимого.
1. Запятые (виновник номер один)
Это самая распространенная ошибка JSON. JavaScript позволяет оставлять запятую после последнего элемента объекта или массива; JSON, согласно спецификации RFC 8259, этого не делает. Таким образом, {"name": "Alice", "age": 30,} недопустимо из-за запятой после 30, а ["a", "b",] недопустимо по той же причине. Решение состоит в том, чтобы просто удалить запятую после последнего свойства или элемента массива. Это раздражает всех: от новичков, вручную редактирующих файл конфигурации, до пожилых людей, вставляющих фрагмент из JavaScript.
2. Одинарные кавычки вместо двойных.
JSON требует двойных кавычек как для ключей, так и для строковых значений. Одинарные кавычки допустимы в JavaScript и Python, но не в JSON. Итак, {'name': 'Alice'} недействительно; это должно быть {"имя": "Алиса"}. Обычно это происходит, когда полезные данные получены из файла console.log JavaScript или вывода str() Python. Поиск и замена одинарных кавычек на двойные часто работает, но следите за апострофами внутри строк, «это» может сломаться, поэтому исправление с помощью синтаксического анализатора безопаснее.
3. Ключи без кавычек
В JavaScript вы можете писать ключи объекта без кавычек: {name: "Alice"}. JSON не позволяет этого, каждый ключ должен быть строкой в двойных кавычках. Итак, {name: "Alice"} должно стать {"name": "Alice"}. Это еще один признак копирования литерала объекта JavaScript непосредственно в контекст JSON.
4. Отсутствующие или несовпадающие скобки.
Каждой открывающей скобке нужна закрывающая скобка, а каждой открывающей квадратной скобке — своя пара. Если они не совпадают, вы получите страшное сообщение «Неожиданный конец ввода JSON». Их трудно заметить на глаз в большом файле, где форматтер, который красиво печатает и выделяет соответствие скобок, зарабатывает себе на жизнь, несовпадающие скобки выскакивают в момент отступа в структуре.
5. Комментарии
JSON не имеет комментариев. Не // строчные комментарии, не блокирующие комментарии. Если вы добавили комментарий для пояснения поля, анализатор отклонит весь файл. В настройках VS Code используется вариант JSONC, который допускает комментарии, а также расширенный набор JSON5, который допускает комментарии, одинарные кавычки и конечные запятые, но стандартные анализаторы, такие как JSON.parse, модуль Python json и большинство серверных библиотек, принимают только строгий JSON. Для файлов конфигурации, требующих комментариев, лучше использовать YAML или JSONC, чем преобразование JSON.
6. Значения JavaScript, которые не являются допустимыми JSON.
В JavaScript существуют три значения, но нет в JSON: undefined, NaN и Infinity. Если ваш источник данных создал один из них, который часто встречается при сериализации объектов, содержащих неудачное числовое преобразование, результатом будет недопустимый JSON. Исправление состоит в том, чтобы заменить их нулевым значением (JSON-эквивалент «нет значения») или разумным значением по умолчанию. Ошибка обычно возникает в восходящем направлении, в момент создания данных, а не в самом JSON.
7. Неэкранированные символы в строках
Некоторые символы внутри строки JSON должны быть экранированы обратной косой чертой. Необработанная новая строка, табуляция или буквальная обратная косая черта приведут к сбою анализа. Таким образом, путь Windows, например «C:\Users\Alice», недействителен, обратную косую черту необходимо удвоить до «C:\\Users\\Alice», а настоящий разрыв строки внутри строки должен быть записан как \n. Во многих редакторах они невидимы, поэтому их сложно выследить.
Самый быстрый рабочий процесс отладки
Худшее сообщение об ошибке JSON — это просто «неверный json» без указания местоположения. Хороший валидатор делает три вещи: сообщает, что не так, сообщает, где (строка и столбец), и показывает окружающий контекст. Самый быстрый рабочий процесс — вставить файл в валидатор, прочитать строку, на которую он указывает, а затем проверить строку над ней, поскольку анализатор часто понимает, что что-то не так, только когда он достигает следующего токена, поэтому недостающая запятая в строке 4 отображается как ошибка в строке 5. Если ошибка указывает на позицию 0, проверьте, нет ли метки порядка байтов или случайного текста перед открывающей скобкой.
Предотвращение недействительного JSON
Три привычки предотвращают большую часть проблем с JSON. Никогда не редактируйте большие файлы JSON вручную без инструмента, учитывающего грамматику. Печатайте при сохранении красиво, потому что структурные ошибки очевидны в JSON с отступом и скрыты в компактной одной строке. И проверьте перед фиксацией: простая проверка в вашем конвейере CI выявляет синтаксические ошибки до того, как они достигнут какой-либо среды. Самый неправильный JSON — это один символ от допустимого; Хитрость заключается в том, чтобы поймать этого персонажа как можно раньше.