Помилки 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 те саме сказано про ідентифікатори.
Швидкі відповіді
Чому мій JSON не працює, хоча виглядає правильно?
Найпоширеніші причини: кома в кінці, одинарні лапки, коментар або фігурні лапки, скопійовані з документа. Перевірте позицію в повідомленні про помилку та символ безпосередньо перед нею.
Чи може JSON містити коментарі?
Ні. Стандарт JSON не допускає коментарів. Видаліть їх або перенесіть примітки в окреме поле. Кнопка Виправити у форматувальнику видалить їх за вас.
Що використовувати замість undefined у JSON?
Використовуйте null, якщо значення навмисно відсутнє, або взагалі пропустіть ключ. undefined — це значення JavaScript, яке в JSON не має відповідника.
Переклад з Англійський оригінал за допомогою ШІ.
Коментарі
Коментарів поки немає. Будьте першим.


