JSON Toolkit

Чому висяча кома ламає JSON

Головне: Висячі коми законні в обʼєктних літералах JavaScript і фатальні в JSON. Ось точна помилка, граматика RFC 8259, що її спричиняє, і три виправлення, які справді тримаються.

Початковий~3 хв читанняОпубліковано 2026-10-30Оновлено 2026-10-30
Чому висячі коми зазнають збою в JSON і як їх виправити

Коротко: JSON забороняє висячі коми всюди — коли парсер зазнає збою, видаліть останню кому форматувальником; використовуйте JSON5 або JSONC лише для локального поблажливого розбору й завжди видавайте стандартний JSON іншим системам.

Бо так каже граматика.

{
  "name": "demo",
  "size": 12,
}

JSON.parse кидає Unexpected token } in JSON at position 34. Node формулює інакше, але кожен рушій вказує на те саме місце: кому перед }.

На що парсер насправді скаржиться

Продукція обʼєкта в RFC 8259 така:

object = begin-object [ member *( value-separator member ) ] end-object

Квадратні дужки означають необовʼязковість, зірочка означає нуль або більше. Простими словами: коми розділяють членів, а за останнім членом іде безпосередньо }.

Тож після коми парсер готовий до ще однієї назви члена. Він читає } і зазнає збою. Масиви поводяться ідентично — [1, 2, 3,] зазнає збою на ].

Звідки береться звичка

Обʼєктні літерали JavaScript дозволяють висячі коми з ES5, як і списки Python та складені літерали Go. Редактори додають їх автоматично. Потім хтось копіює обʼєктний літерал із файлу .js у файл .json, і файл перестає розбиратися.

Інше поширене джерело — ручне складання JSON: цикл, що виконується до i <= length, лишає кому після останнього елемента.

Три виправлення

Приберіть кому. Добре для ручних редакцій. Вставте в форматувальник JSON, і помилка повідомиться з рядком і стовпцем, тож ви побачите, яку саме видалити.

Розбирайте як JSON5. Надмножини приймають висячі коми, що добре для локальної конфігурації. Це не добре для всього, що ви надсилаєте іншій системі — отримувач усе одно його відхилить.

Припиніть склеювати рядки. Використовуйте JSON.stringify, json.dumps, Jackson. Серіалізатор правильно обробляє роздільники й водночас розвʼязує екранування.

Швидкий список перевірки

Де Типова причина
Конкатенація в циклі i <= length лишає одну зайву кому
Копіювання-вставлення Обʼєктний літерал, піднятий із JS-файлу
Шаблони Вбудована кома плюс цикл, що додає ще одну
Ручна редакція Останнє поле видалено, його кому залишено

Часті питання

Чому висячі коми законні в JavaScript, але не в JSON?

Обʼєктні літерали JavaScript дозволяють їх з ES5, як і списки Python і складені літерали Go, через що звичка слідує за людьми в JSON. RFC 8259 дозволяє коми лише між членами: за останнім членом іде безпосередньо } або ]. Копіювання обʼєктного літерала з файлу .js у файл .json — звичне джерело.

Чи розбирати як JSON5, щоб приймати висячі коми?

Лише для локальної конфігурації. Надмножини приймають висячі коми, але все, що ви надсилаєте іншій системі, розбирається як строгий JSON і все одно зазнає збою. Генеруйте стандартний JSON на вихідній межі замість розраховувати на поблажливість отримувача.

Де шукати насамперед після помилки висячої коми?

Почніть із позиції в повідомленні про помилку: вона зазвичай вказує на кому перед } або ]. Потім перевірте три звичні джерела: цикл, написаний із i <= length, обʼєктний літерал, вставлений із JS-файлу, і шаблон, що вбудовує кому поряд із циклом. Вставлення у форматувальник повідомляє точний рядок і стовпець.

Додаткове читання