Skip to main content
Developer Tools

JSON vs JSON5 vs JSONC: Was welcher Parser wirklich akzeptiert

Drei Formate, eine Dateiendung und keine Einigkeit darüber, was gültig ist. Gemessen an den echten Parsern, darunter zwei, die sich widersprechen und dieselbe Bibliothek sind.

Von 6 min read
Die Wörter JSON, JSONC und JSON5 übereinander in großer weißer Schrift auf dunklem Grund, eingerahmt von zwei überdimensionierten geschweiften Klammern

Eine Konfigurationsdatei, die Ihr Editor klaglos darstellt, kann JSON.parse trotzdem um die Ohren fliegen. Beide haben recht. Sie lesen verschiedene Sprachen, die sich eine Dateiendung teilen.

Von diesen Sprachen sind drei verbreitet, und nur eine davon hat eine Spezifikation, die alle gleich umsetzen.

Was striktes JSON wirklich erlaubt

JSON, wie es RFC 8259 definiert, ist eine kleine Teilmenge von JavaScript-Objektliteralen, und die Grammatik passt tatsächlich auf eine Serviette1: Objekte mit Keys in doppelten Anführungszeichen, Arrays, Strings in doppelten Anführungszeichen, Dezimalzahlen und die drei Literale true, false und null.

Alles, worüber man stolpert, folgt daraus, dass das die ganze Sprache ist.

Keine Kommentare. Weder // noch /* */. Crockfords angegebener Grund für die Streichung ist, dass Leute begonnen hatten, sie als Parser-Direktiven zu verwenden, was die Interoperabilität zerstört hätte5. Ob man das überzeugend findet oder nicht: die Grammatik kennt keine Produktion für Kommentare, ein Parser, der einen akzeptiert, parst also kein JSON.

Keine nachgestellten Kommas. [1, 2, 3,] ist ungültig, und das ist die mit Abstand häufigste Art, wie eine handbearbeitete Datei kaputtgeht.

Keys sind Strings in Anführungszeichen. {foo: 1} ist JavaScript. {"foo": 1} ist JSON.

Kein Hex, kein NaN, kein Infinity. Hier lohnt Genauigkeit, weil es oft verkehrt herum erzählt wird: JavaScript erzeugt diese Werte ebenfalls nicht. JSON.stringify(NaN) liefert den String null, und JSON.stringify(Infinity) genauso. Die Werte überstehen einen Roundtrip von vornherein nicht.

Doppelte Keys sind undefiniertes Verhalten. Der RFC sagt, Namen SOLLTEN eindeutig sein, und dass das Verhalten unvorhersehbar ist, wenn sie es nicht sind1. Die meisten Parser behalten den letzten. Manche brechen ab.

Die Strenge ist der ganze Wert. Wenn alle Implementierungen sich über die Grammatik einig sind, liest sich eine in Python geschriebene Datei in Go identisch.

JSONC hat keine Spezifikation, nur Standardwerte

JSONC ist das, was Microsoft "JSON with Comments" nennt. VS Code öffnet settings.json, tasks.json, launch.json und alles andere in .vscode/ in diesem Modus3.

Die übliche Zusammenfassung lautet, JSONC sei striktes JSON plus zwei Kommentarsyntaxen und sonst nichts. Diese Zusammenfassung ist falsch, und man kann ihr beim Falschsein zusehen.

Eine tsconfig.json mit einem Kommentar und zwei nachgestellten Kommas, vier Parsern übergeben: JSON.parse wirft einen SyntaxError, jsonc-parser meldet mit Standardoptionen vier Fehler und mit allowTrailingComma keinen, TypeScript parst sie erfolgreich
Zwei dieser Zeilen sind dieselbe Bibliothek in derselben Version und unterscheiden sich nur durch eine Option.

Microsofts eigene Dokumentation sagt, der Modus akzeptiere auch nachgestellte Kommas, sie seien aber unerwünscht und der Editor zeige eine Warnung3. TypeScript 5.9.3 liest eine tsconfig.json mit Kommentar und nachgestellten Kommas und liefert eine geparste Konfiguration ganz ohne Diagnosen zurück. Das Paket jsonc-parser, ebenfalls von Microsoft, lehnt dieselbe Datei mit vier Fehlern ab, solange man nicht allowTrailingComma übergibt.

"Ist das gültiges JSONC" hat also keine Antwort, ohne den Parser und seine Optionen zu nennen. Das ist der praktische Unterschied zu den beiden anderen: JSON hat einen RFC, JSON5 hat eine Spezifikation, und JSONC hat einen Standardwert.

JSON5 ist aufgeschrieben

JSON5 ist eine deutlich größere Erweiterung, und anders als JSONC ist sie aufgeschrieben2. Hinzu kommen:

  • Kommentare mit // und /* */
  • Nachgestellte Kommas in Objekten und Arrays
  • Keys ohne Anführungszeichen, sofern der Key ein gültiger Bezeichner ist
  • Strings in einfachen Anführungszeichen
  • Mehrzeilige Strings über escapte Zeilenumbrüche
  • Hexadezimalzahlen
  • Führende und nachgestellte Dezimalpunkte, also .5 und 5.
  • Infinity, -Infinity und NaN
  • Ein explizites führendes + bei Zahlen

Erklärtes Ziel ist eine Obermenge von JSON, gebaut aus Produktionen von ECMAScript 5.1 und darauf ausgelegt, von Menschen leichter von Hand geschrieben und gepflegt zu werden2. Praktisch heißt das: gültiges JSON5 ist gültiges JavaScript, das Sie in eine .js-Datei einfügen könnten.

Die Referenztabelle

"Kommt darauf an" ist in der JSONC-Spalte keine Ausflucht. Es ist die Antwort.

KonstruktJSONJSONCJSON5
Kommentare // und /* */NeinJaJa
Nachgestellte KommasNeinJe nach ParserJa
Keys ohne AnführungszeichenNeinNeinJa
Einfache AnführungszeichenNeinNeinJa
Hex-ZahlenNeinNeinJa
NaN und InfinityNeinNeinJa
Führender oder nachgestellter PunktNeinNeinJa
Von JSON.parse akzeptiertJaNeinNein
Hat eine schriftliche SpezifikationJaNeinJa

Alles darüber wurde am 19.08.2026 durch JSON.parse unter Node 24.18, jsonc-parser 3.3.1 und json5 laufen gelassen, statt aus einer anderen Tabelle übernommen.

Die Endung sagt Ihnen nichts

Drei Konfigurationsdateien mit der Endung .json nebeneinander: package.json als striktes JSON geparst, tsconfig.json mit Kommentaren und nachgestellten Kommas, babel.config.json als JSON5
Diese drei liegen häufig im selben Repository, und ein Werkzeug, das alle mit einem Parser liest, ist bei zweien kaputt.

Der Rat, den alle geben, auch die frühere Fassung dieses Artikels, lautet, JSON5-Dateien .json5 zu nennen, damit niemand überrascht wird. Der Rat ist gut. Babel befolgt ihn nicht: babel.config.json und .babelrc.json werden als JSON5 geparst4, Endung hin oder her.

Zur konkreten Frage, warum tsconfig.json Kommentare duldet und package.json nicht, gibt es einen eigenen Artikel, bislang nur auf Englisch.

Eines auswählen

Striktes JSON, wenn irgendetwas außer Ihnen die Datei liest. API-Antworten, Exporte, Logs, Schema-Dateien. Jede Sprache hat einen schnellen strikten Parser, und niemand muss fragen, welchen Dialekt Sie meinten.

JSONC, wenn ein Werkzeug, das Sie ohnehin verwenden, es nativ unterstützt, praktisch also VS-Code-Konfiguration und tsconfig.json. Sie bekommen Kommentare dort, wo Kommentare sich wirklich lohnen: in einer Datei, die sich selten ändert und beim Ändern erklärt werden muss.

JSON5, wenn Sie Portabilität bewusst gegen Ergonomie getauscht haben, und sagen Sie es im Dateinamen. Interne Build-Konfiguration, Fixtures mit viel wiederholter Struktur.

Der Problemfall ist eine Datei namens config.json, die still JSON5-Features verwendet, denn die nächste Person greift zu JSON.parse und bekommt einen Stacktrace ohne jeden Hinweis darin.

Eine Datei lesen, deren Dialekt Sie nicht kennen

Fügen Sie sie in den JSON-Dialekt-Detektor ein: er benennt den Dialekt, zeigt auf die genaue Zeile jedes Konstrukts, das striktes JSON ablehnen würde, und wandelt das Dokument in einfaches JSON um. Unser JSON-Formatter arbeitet nach der strikten Grammatik, wenn er also bei einer Datei einen Fehler meldet, mit der Ihr Editor zufrieden ist, ist diese Datei kein JSON.

Im Code sollten Sie Kommentare nicht per regulärem Ausdruck entfernen. Nehmen Sie einen Parser, der den Dialekt versteht, und geben Sie ihm die Optionen, die Sie tatsächlich wollen:

import { parse } from 'jsonc-parser';

const errors = [];
const value = parse(source, errors, { allowTrailingComma: true });
if (errors.length) throw new Error(`fehlerhafte Konfiguration: ${errors.length} Probleme`);
// `value` sind jetzt einfache Daten und lassen sich mit JSON.stringify neu serialisieren

Für den Wechsel zwischen Serialisierungsformaten decken JSON zu YAML , JSON zu CSV und TOML zu JSON die üblichen Richtungen ab.

Wenn ein Parse-Vorgang scheitert, ist die nützliche erste Frage nicht, ob Ihr JSON falsch ist. Sie lautet, in welcher der drei Sprachen die Datei geschrieben ist und welche der Parser erwartet hat.

Quellen

Jede Zahl in diesem Artikel lässt sich auf eine Quelle unten zurückführen. Behauptungen ohne Beleg wurden gestrichen, nicht abgeschwächt.

  1. PrimärquelleIETF

    Die vollständige JSON-Grammatik, die weder eine Produktion für Kommentare noch nachgestellte Kommas kennt, und die Aussage, dass das Verhalten bei nicht eindeutigen Objektnamen unvorhersehbar ist.

  2. PrimärquelleJSON5

    JSON5s vollständige Liste der Erweiterungen gegenüber JSON und das erklärte Verhältnis zu JSON und zu ECMAScript 5.1.

  3. PrimärquelleMicrosoft

    Dass der Modus JSON with Comments für VS Codes eigene Konfigurationsdateien verwendet wird, beide Kommentarsyntaxen unterstützt und nachgestellte Kommas mit einer Warnung akzeptiert.

  4. PrimärquelleBabel

    Dass babel.config.json und .babelrc.json trotz der Endung .json als JSON5 geparst werden.

  5. BerichterstattungHacker News

    Crockfords angegebener Grund für das Entfernen der Kommentare, nämlich dass sie zum Transport von Parser-Direktiven verwendet wurden. Aus dieser Diskussion zitiert, weil der ursprüngliche Google-Plus-Beitrag von 2012 nicht mehr erreichbar ist.

Themen

  • JSON
  • JSON5
  • JSONC
  • Parsers
  • Configuration

In diesem Artikel erwähnte Tools

Neue Tools per E-Mail

Neue Tools und gelegentlich ein ausführlicher Artikel, etwa einmal im Monat. Kein Spam, deine Adresse bekommt niemand, Abmeldung mit einem Klick.

Ähnliche Artikel

Titelkarte des Artikels. Ein großes Paar bernsteinfarbener geschweifter Klammern, mit der Zeile: one format, three dialects
Developer Tools Guide

Der JSON-Leitfaden für Entwickler: Alles Wichtige für 2026

Die Spezifikation, die uneinigen Dialekte, die Zahlen, die still kaputtgehen, und der Sicherheitsrat, der auf die falsche Rekursion zeigt. Mit Cluster-Karte.

Titelkarte des Artikels. Ein Paar große geschweifte Klammern mit einem bernsteinfarbenen Warnzeichen dazwischen, mit der Zeile: the parser knows where it broke
Developer Tools

Fehlerhaftes JSON debuggen: ein Feldhandbuch

Die Parse-Meldung ist besser als ihr Ruf. Wie man liest, was V8 heute sagt, die fünf Fehlerarten hinter kaputten Payloads, und die zwei Meldungen ohne Position.

Titelkarte des Artikels. Drei graue Quadrate und ein Pfeil führen zu vier schmaleren bernsteinfarbenen Balken, mit der Zeile: 3 bytes become 4 characters
Developer Tools

Base64 erklärt: Was es ist, warum es existiert und wann nicht

Was Base64 mit Ihren Bytes macht, die drei Varianten, die fast alle Decode-Fehler verursachen, und die Stellen, an denen es sich lohnt.