JSON-Syntax-Spickzettel
Die JSON-Syntax nach RFC 8259 lässt sich auf sechs strukturelle Zeichen, vier erlaubte Whitespace-Zeichen, zwei Container, sechs Werttypen und eine strenge Grammatik für Strings und Zahlen reduzieren. Dieser Spickzettel bringt jede Regel auf eine Seite – einschließlich der exakten Fehler, die Parser zurückweisen, von nachgestellten Kommas bis zu hexadezimalen Literalen.
JSON-Syntax-Spickzettel erklärt
Die vollständige JSON-Grammatik passt in ein paar Dutzend Zeilen ABNF, und fast jeder Parsing-Fehler aus der Praxis ist einer von einem Dutzend konkreter Fehler. Diese Seite ist die Referenzversion dieses Wissens: Jeder Abschnitt formuliert einen Teil der Grammatik exakt so, wie RFC 8259 ihn definiert, und zeigt die Regel dann als kopierbares JSON, das Sie in einen Formatter oder Validator einfügen und bestehen oder scheitern sehen können.
Drei Dokumente zählen, wenn Sie Primärquellen wollen. RFC 8259 ist der geltende Internetstandard, ECMA-404 ist das identische Zwillingsdokument von Ecma International, und die Zahlengrammatik in RFC 8259 übernimmt bewusst die Zahlengrammatik der ECMAScript-Spezifikation – ohne deren Oktal- und Hexadezimal-Erweiterungen. Jede Regel unten lässt sich auf eine dieser drei Quellen zurückführen – nichts hier ist Konvention oder Folklore.
Die Regeln sind kurz, aber unbarmherzig: Es gibt kein nachsichtiges JSON. Ein konformer Parser akzeptiert ein Dokument als Ganzes oder weist es mit einem Syntaxfehler zurück, und die Zurückweisungen sammeln sich um die Handvoll Regeln, die Entwickler am häufigsten vergessen – Quoting-Stil, nachgestellte Kommas, Kommentare, führende Nullen. Lernen Sie sie unten einmal, und die meisten Validierungsfehler hören auf, Rätsel zu sein.
Regeln bleiben am besten hängen, wenn man sie absichtlich bricht; halten Sie also den JSON-Formatter in einem zweiten Tab offen und lassen Sie jedes Beispiel dieser Seite beim Lesen neu einrücken.
Wenn Sie ein Urteil statt einer hübschen Formatierung wollen, der JSON-Validator meldet die exakte Zeile und Spalte der ersten Regel, die ein Dokument bricht.
Die sechs strukturellen Zeichen
Sechs Satzzeichen tragen die gesamte Struktur in JSON: die geschweiften Klammern { }, die Objekte umschließen, die eckigen Klammern [ ], die Arrays umschließen, der Doppelpunkt :, der einen Schlüssel von seinem Wert trennt, und das Komma , das Paare innerhalb eines Objekts oder Werte innerhalb eines Arrays trennt. Nichts anderes in der Grammatik leistet strukturelle Arbeit – jedes andere Zeichen in einem Dokument steckt entweder in einem String oder ist eines der vier Whitespace-Zeichen. Ein Komma ist strikt ein Trennzeichen: Es darf zwischen zwei Elementen stehen, nie vor einer schließenden Klammer.
| Zeichen | Name | Aufgabe in der Grammatik |
|---|---|---|
| { } | Geschweifte Klammern | Öffnen und schließen ein Objekt – eine Menge von Schlüssel/Wert-Paaren |
| [ ] | Eckige Klammern | Öffnen und schließen ein Array – eine geordnete Liste von Werten |
| : | Doppelpunkt | Trennt einen Schlüssel von seinem Wert innerhalb eines Objekts |
| , | Komma | Trennt Paare oder Array-Elemente – nie das Letzte vor einer schließenden Klammer |
Gültig – Kommas nur zwischen Elementen
{"name":"Ada","tags":["math","pioneer"]}Ungültig – nachgestelltes Komma vor einer schließenden Klammer
{"name":"Ada","tags":["math","pioneer"],}Whitespace: genau vier Zeichen
Außerhalb von Strings erlaubt JSON genau vier Whitespace-Zeichen: das Leerzeichen (U+0020), den horizontalen Tabulator (U+0009), den Line Feed (U+000A) und den Carriage Return (U+000D). Alles andere – vertikaler Tab, Form Feed, geschütztes Leerzeichen, ein Byte-Order-Mark – ist ein Syntaxfehler, auch wenn viele Editoren diese Zeichen unsichtbar darstellen. Deshalb scheitert aus einer Textverarbeitung eingefügtes JSON so oft an der Validierung: Das Dokument sieht auf dem Bildschirm sauber aus und enthält Zeichen, von denen die Grammatik nie gehört hat.
Whitespace ist auch das, was Formatieren überhaupt möglich macht. Weil die Grammatik diese vier Zeichen zwischen Tokens ignoriert, kann dasselbe Dokument auf der Leitung eine lange Zeile sein und in Ihrem Editor ein eingerückter Baum; beide Formen sind semantisch identisch – kein Parser kann sie nach dem Lesen unterscheiden.
Minifiziert – kein optionaler Whitespace
{"a":1,"b":[2,3]}Formatiert – Whitespace ergänzt, Daten unverändert
{
"a": 1,
"b": [
2,
3
]
}Strings: doppelte Anführungszeichen und die neun Escapes
Ein JSON-String steht in doppelten Anführungszeichen – niemals in einfachen. Innen leitet der Backslash \ ein Escape ein, und RFC 8259 definiert genau neun zweizeichige Escapes: Zwei sind obligatorisch, \\" für ein literales doppeltes Anführungszeichen und \\\\ für einen literalen Backslash, weil diese beiden Zeichen den String sonst beenden oder beschädigen würden. Sechs weitere sind optionale Kurzformen – \/ für den Schrägstrich und \b \f \n \r \t für die fünf Steuerzeichen, die in Text am häufigsten vorkommen. Die neunte Form ist \uXXXX, die jeden Unicode-Codepunkt über seine vierstellige Hexadezimalzahl schreibt.
Jedes Zeichen außerhalb des Escape-Sets darf literal als UTF-8 erscheinen, und beide Formen sind gleichwertig: Ein Parser liefert in beiden Fällen denselben String. Escaping ist Schreibweise, keine Daten – ein Punkt, den der Escaping-Leitfaden in die Tiefe führt.
| Escape | Erzeugt | Status laut RFC 8259 |
|---|---|---|
| \" | doppeltes Anführungszeichen | Obligatorisch – die einzige Möglichkeit, innerhalb eines Strings zu quoten |
| \\ | Backslash | Obligatorisch – die einzige Möglichkeit, einen literalen Backslash zu schreiben |
| \/ | Schrägstrich | Optionale Kurzform, legal aber selten nötig |
| \b \f \n \r \t | Backspace, Form Feed, Zeilenumbruch, Carriage Return, Tabulator | Benannte Escapes für die fünf gängigen Steuerzeichen |
| \uXXXX | jeder Codepunkt, z. B. \u00e9 für é | Universelle Form – exakt vier Hex-Ziffern |
Escapte Form in der Datei
"quote": "she said \"hi\"" "path": "C:\\Users\\ada" "e-acute": "\u00e9"
Was ein Parser zurückgibt
quote: she said "hi" path: C:\Users\ada e-acute: é
Zahlen: ECMAScript ohne die Erweiterungen
Eine Zahl ist ein Integer oder Dezimalwert in gewöhnlicher Notation, mit optionalem Exponenten. RFC 8259 übernimmt die ECMAScript-Zahlengrammatik und streicht ihre Erweiterungen: kein Hexadezimal, kein Oktal, keine führenden Nullen, kein führendes Plus, kein nackter abschließender Punkt. Ein Exponent verwendet e oder E mit optionalem Vorzeichen, und das einzige Vorzeichen, mit dem eine Zahl beginnen darf, ist der schlichte Bindestrich. NaN, Infinity und -Infinity sind kein JSON – Sprachen mit solchen Konstanten schreiben stattdessen null, so die Konvention.
Die Präzision bleibt bewusst den Implementierungen überlassen: Die Grammatik sagt nichts darüber, wie viele Ziffern ein Parser berücksichtigen muss, sodass sehr lange Zahlen stillschweigend verändert ankommen können. Interoperable Erzeuger halten Integers innerhalb des Bereichs, den die Zielplattform exakt darstellt – bei den IEEE-754-Doubles hinter JavaScript sind das bis zu 2^53 − 1.
| Geschrieben | Urteil | Warum |
|---|---|---|
| 42, -17, 3.14 | Gültig | Gewöhnliche Integer- und Dezimalformen |
| 2.1e10, 5E-3 | Gültig | Exponenten: e oder E, danach ein optionales Vorzeichen |
| 01, -01 | Ungültig | Führende Nullen sind verboten – schreiben Sie 1 |
| 1., .5, +6 | Ungültig | Ein Punkt braucht auf beiden Seiten Ziffern; kein führendes Plus |
| 0x1F, 1_000 | Ungültig | Hexadezimal- und Zifferntrenner sind JavaScript-Erweiterungen |
| NaN, Infinity | Ungültig | Kein Teil der Grammatik; JSON kennt solche Konstanten nicht |
| 9007199254740993 | Riskant | Parsst, aber überschreitet den exakten Integer-Bereich von IEEE-754-Doubles |
Die drei Literale und die fünf klassischen Zurückweisungen
Drei nackte Tokens vervollständigen die Wertmenge: true, false und null. Sie sind klein geschrieben und ohne Anführungszeichen – True, FALSE und None sind Syntaxfehler, keine kreative Großschreibung. Um sie herum zieht die Grammatik fünf Linien, die fast jedes in der Wildnis zurückgewiesene Dokument erklären:
- Keine Kommentare. RFC 8259 kennt keine Kommentarsyntax; // oder /* */ an jeder Stelle ist ein Syntaxfehler. Kommentieren Sie, wo das Format in Ihrer Hand liegt, mit einem Geschwister-Schlüssel wie "_comment".
- Keine nachgestellten Kommas. [1, 2, 3,] und {"a":1,} sind ungültig, so freundlich sie auch aussehen – das Komma ist ein Trennzeichen, und es kann kein Element von nichts trennen.
- Keine einfachen Anführungszeichen und keine Schlüssel ohne Anführungszeichen. {name:'ada'} ist ungültiges JSON; {"name":"ada"} ist die einzige Schreibweise der Grammatik.
- Keine doppelten Schlüssel – zumindest offiziell. Die Grammatik erlaubt, dass ein Name zweimal auftaucht, aber RFC 8259 §4 überlässt es den Implementierungen, welcher Wert gewinnt; ein Dokument, das sich auf Duplikate verlässt, hat also keine definierte Bedeutung.
- Jeder Wert auf oberster Ebene. Seit RFC 8259 darf ein ganzes Dokument ein nackter String, eine Zahl, ein Boolean oder null sein – die Nur-Objekte-und-Arrays-Regel von RFC 4627 ist gestrichen, und "hello" oder 42 sind vollwertige JSON-Dokumente.
Kodierung: UTF-8 und die Regeln auf Byte-Ebene
RFC 8259 §8.1 legt die Byte-Kodierung fest: JSON-Text, der zwischen Systemen ausgetauscht wird, die nicht Teil eines geschlossenen Ökosystems sind, muss in UTF-8 kodiert sein. UTF-16- oder UTF-32-JSON gibt es auf offener Leitung nicht, und Erzeuger dürfen kein Byte-Order-Mark voranstellen – ein Parser darf ein führendes BOM ignorieren, statt einen Fehler zu werfen, aber nichts Konformes gibt eines aus. Beachten Sie, wie sich die Ebenen trennen: \uXXXX-Escaping ist eine Notationswahl innerhalb einzelner Strings, während UTF-8 eine Eigenschaft des ganzen Dokuments ist; beide lösen unterschiedliche Probleme.
Damit ist die Grammatik abgeschlossen. Am schnellsten werden diese Regeln bleibend, wenn Sie eigene Dokumente dagegen laufen lassen – formatieren Sie eine echte Nutzlast, brechen Sie jedes Mal genau eine Regel, und lesen Sie jeden Validator-Fehler. Zehn Minuten absichtlichen Scheiterns lehren mehr als ein weiterer Durchgang durch diese Seite.
Häufig gestellte Fragen
Kann ich echte API-Daten in die von dieser Seite verlinkten Werkzeuge einfügen?
Ja. Der Formatter und der Validator auf dieser Website laufen vollständig in Ihrem Browser: Ihr Dokument wird von JavaScript innerhalb des Tabs geparst, und es gibt keinen Upload-Schritt, den man prüfen müsste. Sie können es selbst bestätigen – das Network-Panel des Browsers bleibt stumm, während die Werkzeuge arbeiten, und die Content-Security-Policy der Website blockiert ausgehende Verbindungen, sodass nicht einmal eine veränderte Kopie der Seite Ihre Daten übertragen könnte.
Erlaubt JSON einfache Anführungszeichen für Strings?
Nein. RFC 8259 definiert Strings als doppelt gequoted, für Schlüssel wie für Werte, und gibt einfachen Anführungszeichen keinerlei Bedeutung – ein Parser, der auf 'hello' trifft, scheitert sofort, während "hello" die einzige gültige Schreibweise ist. Werkzeuge, die einfache Anführungszeichen fröhlich mitlesen, parsen JSON5 oder einen anderen Superset, nicht JSON, weshalb ihre Ausgabe von strengeren Verbrauchern dennoch zurückgewiesen werden kann.
Was genau ist ein nachgestelltes Komma und warum ist es ein Fehler?
Eine Frage der Position, nicht des Zeichens. Ein Komma zwischen zwei Elementen ist ein Trennzeichen; ein Komma unmittelbar vor } oder ] würde ein Element von nichts trennen, und die Grammatik verbietet das. Es ist der mit Abstand häufigste Grund, warum eine handeditierte Datei die Validierung nicht besteht; Generatoren, Minifizierer und Formatierungswerkzeuge entfernen nachgestellte Kommas deshalb vor dem Schreiben für Sie.
Warum dürfen JSON-Zahlen keine führenden Nullen wie 007 haben?
Führende Nullen waren die Schreibweise für Oktal-Literale (Basis 8) in älterem JavaScript, und RFC 8259 übernimmt seine Zahlengrammatik von ECMAScript ohne die Oktal- und Hexadezimal-Erweiterungen – 007 wird also abgelehnt, damit eine Schreibweise genau einen Wert bedeutet. Schreiben Sie 7, und speichern Sie Bezeichner wie Postleitzahlen als Strings, wann immer eine führende Null Teil des Werts ist.
Sind doppelte Schlüssel in einem JSON-Objekt legal?
Die Grammatik erlaubt, dass ein Name zweimal auftaucht, aber der Standard weigert sich bewusst, das Ergebnis zu definieren: RFC 8259 merkt an, dass Implementierungen den letzten Wert, den ersten Wert oder einen Fehler melden. Ein Dokument, dessen Bedeutung von Duplikaten abhängt, ist also kein interoperables JSON – behandeln Sie Duplikate als Bug, selbst wenn Ihr bestimmter Parser sie zufällig stillschweigend akzeptiert.
Wie groß darf eine JSON-Zahl werden, bevor die Präzision bricht?
Die Grammatik setzt keine Zifferngrenze, aber die meisten Parser dekodieren in IEEE-754-Double-Precision-Floats, die Integers nur bis 2^53 − 1 exakt darstellen. Ein 17-stelliger Bezeichner wie 9007199254740993 kann stillschweigend verändert ankommen – der klassische Grund, warum SDKs für APIs mit 64-Bit-IDs anweisen, sie als Strings statt als Zahlen zu behandeln.
Wo kann ich die hier zitierten Standards nachlesen?
Welche verwandten Tools sollten Sie als Nächstes nutzen?
- JSON formatierenEinrückung und Sortierung einstellen, Kommentare entfernenÖffnen
- JSON validierenSyntax prüfen mit exakter Zeile und Spalte, per Klick reparierenÖffnen
- Was ist JSONLeitfaden in verständlicher SpracheÖffnen
- JSON-EscapingLeitfaden in verständlicher SpracheÖffnen
- JSON minifizierenLeerzeichen entfernen und die echte gzip-Größe messenÖffnen
- JSON vs. YAMLDirekter VergleichÖffnen