JSON
13 tools
Was ist JSON?
JSON (JavaScript Object Notation) ist ein leichtgewichtiges, textbasiertes Datenaustauschformat, das für Menschen leicht zu lesen und zu schreiben sowie für Maschinen einfach zu parsen und zu generieren ist. Ursprünglich aus JavaScript abgeleitet, ist JSON sprachunabhängig und gilt heute als De-facto-Standard für den Datenaustausch im Web.
JSON stellt Daten als Schlüssel-Wert-Paare dar, die in Objekten und Arrays organisiert sind. Seine Einfachheit machte es zum dominierenden Format für REST-APIs, Konfigurationsdateien und Datenspeicherung.
Eine kurze Geschichte
JSON wurde von Douglas Crockford Anfang der 2000er Jahre formalisiert. Die Spezifikation wurde 2001 auf json.org veröffentlicht. RFC 4627 folgte 2006, und der aktuelle ECMA-404-Standard wurde 2013 veröffentlicht.
Vor JSON war XML das dominante Datenaustauschformat im Web. JSONs Minimalismus — keine Attribute, keine Verarbeitungsanweisungen, keine Namensräume — machte es sofort populär. Bis 2010 hatte JSON XML bei Web-APIs weitgehend verdrängt.
JSON-Datentypen
JSON unterstützt genau sechs Datentypen. Jeder Wert in einem gültigen JSON-Dokument muss einer dieser sein:
"hello world"Beliebige Unicode-Zeichenfolge in doppelten Anführungszeichen. Escape-Sequenzen mit Backslash (\n, \t, \") werden unterstützt.
42 / 3.14 / 1e10Ganzzahl oder Gleitkommazahl. Wissenschaftliche Notation (1e10) ist erlaubt. Kein Unterschied zwischen int und float auf JSON-Ebene.
true / falseDie Literaltokens true oder false (nur Kleinbuchstaben). Kein truthy/falsy — nur striktes Boolean.
nullDas Literaltoken null (Kleinbuchstaben). Stellt das Fehlen eines Wertes dar. Anders als undefined, was kein JSON-Typ ist.
[1, "two", null]Eine geordnete Liste von Werten in eckigen Klammern. Elemente können gemischte Typen haben und Arrays können beliebig verschachtelt werden.
{"key": "value"}Eine ungeordnete Sammlung von Schlüssel-Wert-Paaren in geschweiften Klammern. Schlüssel müssen Strings sein.
{
"string": "hello world",
"number": 42,
"float": 3.14,
"boolean": true,
"null": null,
"array": [1, 2, 3],
"object": { "nested": "value" }
}JSON-Syntaxregeln
JSON hat strenge Syntaxregeln. Eine kleine Abweichung verursacht einen Parse-Fehler. Diese sechs Regeln sind am wichtigsten:
Alle String-Werte und Objektschlüssel müssen doppelte Anführungszeichen verwenden. Einfache Anführungszeichen sind kein gültiges JSON.
JSON erlaubt keine abschließenden Kommas nach dem letzten Element in einem Array oder der letzten Eigenschaft in einem Objekt.
JSON hat keine Kommentarsyntax. // und /* */ sind nicht gültig. Für Konfigurationsdateien, die Kommentare benötigen, sollte JSON5 oder YAML verwendet werden.
JSON unterstützt nur sechs primitive Typen. JavaScript-Werte wie undefined, NaN, Infinity und Funktionen können nicht dargestellt werden.
Alle Objektschlüssel müssen in Anführungszeichen stehende Strings sein. Numerische Schlüssel oder Bezeichner ohne Anführungszeichen sind nicht erlaubt.
JSON unterscheidet Groß- und Kleinschreibung. true, false und null müssen ausschließlich in Kleinbuchstaben geschrieben werden.
Ungültiges vs. gültiges JSON
{
'name': 'Alice', // single quotes — invalid
age: 30, // unquoted key — invalid
"scores": [1, 2, 3,], // trailing comma — invalid
"note": undefined // undefined — invalid
}{
"name": "Alice",
"age": 30,
"scores": [1, 2, 3],
"note": null
}JSON im modernen Web
REST-APIs
JSON ist das Standard-Body-Format für REST-API-Anfragen und -Antworten. Content-Type: application/json ist der häufigste MIME-Typ im modernen Web.
Konfigurationsdateien
package.json, tsconfig.json, .eslintrc und viele andere Entwicklertools verwenden JSON für die Konfiguration.
NoSQL-Datenbanken
Dokumentdatenbanken wie MongoDB, CouchDB und Amazon DynamoDB speichern Daten als JSON-Dokumente.
Frontend-Zustand und Daten
localStorage und sessionStorage speichern Strings, daher werden JSON.stringify/JSON.parse ständig zur Serialisierung von JavaScript-Objekten verwendet.
JSON vs. andere Formate
JSON ist nicht immer die beste Wahl. So schneidet es im Vergleich zu anderen gängigen Datenformaten ab:
Einfachere Syntax, kleinere Dateigröße, einfacher zu parsen, lesbarer
Kein Support für Attribute, Verarbeitungsanweisungen oder XML-Namespaces
Dokumentmetadaten, gemischte Inhaltsmodelle oder XML-Schemata benötigt werden
Strengere Syntax (weniger Mehrdeutigkeit), besserer Tooling-Support, portabler
Kein Kommentar-Support, etwas ausführlicher bei tief verschachtelten Daten
Von Menschen bearbeitete Konfigurationsdateien, Docker Compose, GitHub Actions, Kubernetes
Breitere Ökosystem-Unterstützung, schnelleres Parsing, vorhersehbareres Typhandling
Kein nativer Datumstyp, weniger benutzerfreundlich für komplexe verschachtelte Strukturen
Rust (Cargo.toml), Python (pyproject.toml), INI-Anwendungskonfiguration
Strukturierte und verschachtelte Daten, nicht auf flache Zeilen und Spalten beschränkt
Viel größere Dateigröße, schlechtere Performance für rein tabellarische Daten
Tabellendaten, Datenbankexporte, Daten für Excel oder pandas
JSON Schema
JSON Schema ist ein Vokabular zur Validierung der Struktur von JSON-Dokumenten. Ein Schema beschreibt die erwarteten Typen, Pflichtfelder und Einschränkungen eines JSON-Wertes.
Tools wie ajv (JavaScript), jsonschema (Python) und integrierte Validatoren in vielen IDEs unterstützen JSON Schema. OpenAPI verwendet JSON Schema zur Beschreibung von API-Request- und Response-Bodies.
Häufige JSON-Fallstricke
JSON-Zahlen werden als IEEE 754 Double-Precision-Floats geparst. Ganzzahlen größer als 2^53 verlieren an Genauigkeit. Große IDs als Strings übergeben.
JSON hat keinen Datumstyp. Datumsangaben werden typischerweise als ISO 8601-Strings oder Unix-Timestamps serialisiert.
JSON.stringify wirft einen TypeError bei zirkulären Objektreferenzen. Der Zyklus muss unterbrochen oder eine Bibliothek verwendet werden.
JSON muss als UTF-8, UTF-16 oder UTF-32 kodiert werden. Eine Byte-Order-Mark (BOM) am Anfang einer JSON-Datei ist nicht spezifikationskonform.
Beim Parsen von nicht vertrauenswürdigem JSON kann das Zusammenführen von geparsten Objekten über den __proto__-Schlüssel anfällig für Prototype-Pollution-Angriffe sein.
{"key": null} und ein fehlender "key" sind semantisch verschieden. Null bedeutet, das Feld existiert mit einem fehlenden Wert; fehlend bedeutet, das Feld wurde nicht angegeben.
Häufig gestellte Fragen
JSON steht für JavaScript Object Notation. Trotz des Namens ist JSON vollständig sprachunabhängig.
Nein. JSON ist ein Textformat, das einem JavaScript-Objektliteral ähnelt, aber strengere Regeln hat: Schlüssel müssen in doppelten Anführungszeichen stehen, und undefined, Funktionen oder Kommentare werden nicht unterstützt.
Nein. Die JSON-Spezifikation enthält keine Kommentarsyntax. Für Konfigurationsdateien mit Kommentaren sollte JSONC, JSON5 oder YAML verwendet werden.
JSONP war ein Workaround für die Same-Origin-Policy des Browsers und ist veraltet. CORS sollte stattdessen verwendet werden.
In JavaScript: JSON.stringify(data, null, 2). In Python: json.dumps(data, indent=2). Im Terminal: cat file.json | jq .
NDJSON speichert ein JSON-Objekt pro Zeile. Es ermöglicht Stream-Verarbeitung und ist beliebt für Log-Dateien und große Datenexporte.
Leerzeichen zwischen Tokens sind bedeutungslos. Formatierung ist eine Stilfrage, keine Semantik.
Die JSON-Spezifikation legt keine Größenbeschränkung fest. In der Praxis ist man durch den Parser-Speicher und die Netzwerkübertragung begrenzt.
Nicht direkt. Binärdaten müssen Base64-kodiert werden, bevor sie in JSON eingebettet werden, was die Größe um ~33% erhöht.
JSON5 ist eine Obermenge von JSON, die hinzufügt: Schlüssel ohne Anführungszeichen, Strings in einfachen Anführungszeichen, abschließende Kommas, Kommentare und mehrzeilige Strings.