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

Коротко: 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-файлу, і шаблон, що вбудовує кому поряд із циклом. Вставлення у форматувальник повідомляє точний рядок і стовпець.