JSON Toolkit

Dlaczego przecinek końcowy psuje JSON

Podsumowanie: Przecinki końcowe są legalne w literałach obiektowych JavaScript i zabójcze w JSON-ie. Oto dokładny błąd, gramatyka RFC 8259, która go powoduje, i trzy poprawki, które naprawdę działają.

Początkujący~3 min czytaniaOpublikowano 2026-10-30Zaktualizowano 2026-10-30
Dlaczego przecinki końcowe zawodzą w JSON-ie i jak je poprawić

Najważniejsze: JSON zabrania przecinków końcowych wszędzie — gdy parser zawodzi, usuń ostatni przecinek formaterem; JSON5 lub JSONC używaj tylko do lokalnego łagodnego parsowania, a do innych systemów zawsze emituj standardowy JSON.

Bo gramatyka tak mówi.

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

JSON.parse rzuca Unexpected token } in JSON at position 34. Node formułuje to inaczej, ale każdy silnik wskazuje to samo miejsce: przecinek przed }.

Na co naprawdę narzeka parser

Produkcja obiektu w RFC 8259 to:

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

Nawiasy kwadratowe znaczą opcjonalność, gwiazdka znaczy zero lub więcej. Mówiąc prościej: przecinki rozdzielają składowe, a po ostatniej składowej następuje bezpośrednio }.

Więc po przecinku parser jest gotowy na kolejną nazwę składowej. Czyta } i zawodzi. Tablice zachowują się identycznie — [1, 2, 3,] zawodzi na ].

Skąd bierze się nawyk

Literały obiektowe JavaScript pozwalają na przecinki końcowe od ES5, podobnie listy Pythona i literały złożone Go. Edytory dodają je automatycznie. Potem ktoś kopiuje literał obiektowy z pliku .js do pliku .json i plik przestaje się parsować.

Innym częstym źródłem jest ręcznie budowany JSON: pętla działająca i <= length zostawia przecinek po ostatnim elemencie.

Trzy poprawki

Usuń przecinek. W porządku przy ręcznych edycjach. Wklej do formatera JSON, a błąd zostanie zgłoszony z wierszem i kolumną, więc zobaczysz dokładnie, który usunąć.

Parsuj jako JSON5. Nadzbiory akceptują przecinki końcowe, co jest w porządku dla lokalnej konfiguracji. Nie jest w porządku dla czegokolwiek wysyłanego do innego systemu — odbiorca i tak to odrzuci.

Przestań sklejać łańcuchy. Użyj JSON.stringify, json.dumps, Jackson. Serializator poprawnie obsługuje separatory i jednocześnie rozwiązuje ucieczkę.

Szybka lista audytu

Gdzie Typowa przyczyna
Konkatenacja w pętli i <= length zostawia jeden zbędny przecinek
Kopiuj-wklej Literał obiektowy podniesiony z pliku JS
Szablony Twardy przecinek plus pętla, która dodaje kolejny
Ręczna edycja Usunięto ostatnie pole, a jego przecinek został

FAQ

Dlaczego przecinki końcowe są legalne w JavaScript, a nie w JSON-ie?

Literały obiektowe JavaScript pozwalają na nie od ES5, podobnie listy Pythona i literały złożone Go, dlatego nawyk podąża za ludźmi do JSON-a. RFC 8259 pozwala na przecinki tylko między składowymi: po ostatniej następuje bezpośrednio } lub ]. Kopiowanie literału obiektowego z pliku .js do .json jest zwykłym źródłem.

Czy parsować jako JSON5, aby akceptować przecinki końcowe?

Tylko dla lokalnej konfiguracji. Nadzbiory akceptują przecinki końcowe, ale cokolwiek wysyłasz do innego systemu, jest parsowane jako ścisły JSON i nadal zawiedzie. Emituj standardowy JSON na granicy wyjścia, zamiast liczyć na łagodność odbiorcy.

Czego szukać najpierw po błędzie przecinka końcowego?

Zacznij od position w komunikacie błędu: zwykle wskazuje przecinek przed } lub ]. Potem sprawdź trzy typowe źródła: pętlę zapisaną jako i <= length, literał obiektowy wklejony z pliku JS i szablon, który twardo koduje przecinek obok pętli. Wklejenie do formatera podaje dokładny wiersz i kolumnę.

Dodatkowe materiały