JSON-Tutorial: Syntax, Regeln und JSON in JavaScript und Python
JSON ist das einfachste und am weitesten verbreitete Format für den Datenaustausch. Mit ein paar kurzen Regeln und zwei Funktionen pro Sprache können Sie beliebige Daten lesen, erzeugen und speichern.
Wer mit APIs, mobilen Apps oder auch nur der Konfigurationsdatei eines Projekts arbeitet, stößt früher oder später auf JSON. JSON ist ein Textformat zum Speichern und Übertragen von Daten, das Menschen lesen und jede Programmiersprache mühelos verarbeiten kann. Dieses Tutorial beginnt mit der Definition und den Syntaxregeln, geht ein echtes Beispiel durch, zeigt dann das Lesen und Schreiben von JSON in JavaScript und Python, mit besonderem Augenmerk auf Umlaute und andere Nicht-ASCII-Zeichen, und behandelt zum Schluss typische Fehler und wie Sie sie mit dem JSON Formatter aufspüren. Jedes Stück Code auf dieser Seite wurde ausgeführt, die Ausgaben sind echt.
Was ist JSON?
JSON steht für JavaScript Object Notation. Die Syntax stammt aus der Art, wie Objekte in JavaScript geschrieben werden, ist aber an keine Sprache gebunden: Python, PHP, Java, C#, Go und praktisch jede andere Sprache bringen fertige Werkzeuge dafür mit. JSON ist in den Standards RFC 8259 und ECMA-404 definiert, Dateien tragen die Endung .json, und der Medientyp im Web ist application/json. Typische Einsatzgebiete:
- Web-APIs: Die meisten modernen Dienste senden Anfragen und Antworten als JSON.
- Konfigurationsdateien: etwa
package.jsonin Node.js-Projekten odercomposer.jsonin PHP. - Datenspeicherung: im
localStoragedes Browsers, in JSON-Spalten von Datenbanken wie PostgreSQL und MySQL und in dokumentenorientierten Datenbanken.
Die Syntaxregeln von JSON
Jedes JSON-Dokument besteht aus sechs Arten von Werten, die sich ineinander verschachteln lassen:
| Typ | Beispiel | Beschreibung |
|---|---|---|
| object (Objekt) | {"city": "Lissabon"} | Schlüssel-Wert-Paare in geschweiften Klammern |
| array (Array) | [1, 2, 3] | Eine geordnete Liste von Werten in eckigen Klammern |
| string (Zeichenkette) | "Hallo" | Text in doppelten Anführungszeichen |
| number (Zahl) | 42, -3.5, 1.2e6 | Ganzzahl oder Dezimalzahl, ohne Anführungszeichen |
| boolean (Wahrheitswert) | true, false | Nur in Kleinbuchstaben |
| null | null | Kein Wert vorhanden |
Die Regeln, hinter denen die meisten Fehler stecken:
- Schlüssel sind immer Strings in doppelten Anführungszeichen:
{"name": "Ali"}ist korrekt,{name: "Ali"}nicht. - Nur doppelte Anführungszeichen sind erlaubt;
'Ali'in einfachen Anführungszeichen ist kein gültiges JSON. - Keine abschließenden Kommas: Nach dem letzten Element eines Objekts oder Arrays darf kein Komma stehen.
- Keine Kommentare: weder
//noch/* */. - Keine sprachspezifischen Werte:
undefined,NaN,Infinity,TrueundNonesind kein gültiges JSON. - Zahlen dürfen nicht mit einer Null beginnen:
012ist ungültig. Telefonnummern, Postleitzahlen und ähnliche Kennungen schreiben Sie deshalb als String, etwa"0123456789"; so bleibt auch die führende Null erhalten. - Sonderzeichen in Strings werden maskiert:
\"für ein doppeltes Anführungszeichen,\\für einen Backslash,\nfür einen Zeilenumbruch und\uXXXXfür ein beliebiges Unicode-Zeichen. - Leerzeichen und Zeilenumbrüche zwischen den Bestandteilen spielen keine Rolle; deshalb lässt sich JSON sowohl kompakt in einer Zeile als auch sauber eingerückt schreiben.
Ein echtes Beispiel: eine Bestellung in einem Onlineshop
{
"orderId": 10245,
"createdAt": "2026-09-17T10:30:00Z",
"customer": {
"name": "Maria",
"phone": "0123456789",
"city": "Lissabon"
},
"items": [
{ "title": "Python für Einsteiger", "price": 32, "qty": 1 },
{ "title": "Kabellose Maus", "price": 45, "qty": 2 }
],
"paid": true,
"discountCode": null
}
In diesem Beispiel kommt jede Art von Wert vor. customer ist ein verschachteltes Objekt und items ein Array von Objekten. Die Preise sind Zahlen, die Telefonnummer dagegen ist ein String, damit die führende Null erhalten bleibt. JSON hat keinen Datumstyp, deshalb steht der Bestellzeitpunkt als String im Standardformat ISO 8601. Und discountCode sagt mit null, dass diese Bestellung keinen Rabattcode hatte. Um den Preis des zweiten Artikels zu lesen, schreiben Sie in JavaScript order.items[1].price und in Python order["items"][1]["price"].
JSON in JavaScript
JavaScript hat zwei eingebaute Funktionen, die für die meisten Aufgaben genügen: JSON.parse wandelt JSON-Text in ein Objekt um, und JSON.stringify wandelt ein Objekt in JSON-Text um.
JSON mit JSON.parse lesen
const text = '{"name": "Maria", "age": 28, "skills": ["JavaScript", "Python"], "active": true}';
const user = JSON.parse(text);
console.log(user.name); // Maria
console.log(user.skills[0]); // JavaScript
console.log(user.active); // true
JSON mit JSON.stringify erzeugen
const product = { title: "Reiseführer", price: 32, tags: ["Reisen", "Bestseller"], discount: null };
console.log(JSON.stringify(product));
console.log(JSON.stringify(product, null, 2));
Der erste Aufruf liefert kompaktes, einzeiliges JSON, das sich für die Übertragung übers Netzwerk eignet, der zweite mit 2 als drittem Argument eine gut lesbare Ausgabe mit zwei Leerzeichen Einrückung. Das zweite Argument dient zum Filtern oder Umwandeln von Werten und bleibt meist null. Die Ausgabe:
{"title":"Reiseführer","price":32,"tags":["Reisen","Bestseller"],"discount":null}
{
"title": "Reiseführer",
"price": 32,
"tags": [
"Reisen",
"Bestseller"
],
"discount": null
}
Umlaute und anderer Nicht-ASCII-Text bleiben in der Ausgabe von JSON.stringify genau so, wie sie sind; sie werden nicht in \u-Escapes umgewandelt.
JSON von einer API abrufen und im localStorage speichern
async function loadProduct() {
const res = await fetch("https://api.example.com/products/1");
return await res.json();
}
localStorage.setItem("cart", JSON.stringify({ items: [101, 205] }));
const cart = JSON.parse(localStorage.getItem("cart"));
console.log(cart.items.length); // 2
Die Methode res.json() parst die Antwort selbst und gibt ein Objekt zurück; übergeben Sie ihr Ergebnis nicht noch einmal an JSON.parse. localStorage speichert nur Strings, deshalb wird das Objekt beim Speichern mit JSON.stringify und beim Lesen mit JSON.parse umgewandelt.
Werte, die JSON.stringify verändert
const data = { a: undefined, b: () => 1, c: NaN, d: new Date(Date.UTC(2026, 8, 17)) };
console.log(JSON.stringify(data));
// {"c":null,"d":"2026-09-17T00:00:00.000Z"}
Schlüssel mit dem Wert undefined oder einer Funktion fallen stillschweigend weg, NaN und Infinity werden zu null, und ein Datum wird zu einem ISO-String. Parsen Sie das Ergebnis erneut, bleibt das Datum ein String und wird nicht von selbst wieder zu einem Date.
Fehlerbehandlung
try {
JSON.parse("{'name': 'Ali'}");
} catch (err) {
console.log(err.name); // SyntaxError
console.log(err.message); // Expected property name or '}' in JSON at position 1 (line 1 column 2)
}
Jeder ungültige Text löst einen SyntaxError aus; verarbeiten Sie Daten, die von außen kommen, deshalb innerhalb von try...catch. Die Meldung oben ist die Ausgabe von Node.js und stimmt mit Chrome überein; Firefox und Safari melden denselben Fehler mit anderen Worten.
JSON in Python
In Python erledigt das Standardmodul json die ganze Arbeit, installiert werden muss nichts. Es hat vier Hauptfunktionen: json.loads und json.dumps arbeiten mit Strings, json.load und json.dump direkt mit Dateien; das s in den ersten beiden steht für string.
Einen JSON-String in ein Dictionary umwandeln
import json
text = '{"name": "Maria", "age": 28, "skills": ["JavaScript", "Python"], "active": true}'
user = json.loads(text)
print(user["name"]) # Maria
print(type(user)) # <class 'dict'>
print(user["active"]) # True
| JSON | Python | JavaScript |
|---|---|---|
| object | dict | Object |
| array | list | Array |
| string | str | String |
| number | int oder float | Number |
true / false | True / False | true / false |
null | None | null |
Daten in JSON umwandeln und das Problem mit Umlauten
product = {"title": "Reiseführer", "price": 32, "tags": ["Reisen", "Bestseller"], "discount": None}
print(json.dumps(product))
print(json.dumps(product, ensure_ascii=False, indent=2))
Die erste Ausgabezeile überrascht vielleicht:
{"title": "Reisef\u00fchrer", "price": 32, "tags": ["Reisen", "Bestseller"], "discount": null}
Standardmäßig schreibt json.dumps jedes Nicht-ASCII-Zeichen in der Form \uXXXX, aus ü wird also \u00fc, und Text in anderen Schriften wird genauso Zeichen für Zeichen maskiert. Diese Ausgabe ist gültig, und jedes Programm liest sie korrekt, für Menschen ist sie aber kaum lesbar und belegt mehr Platz. Mit ensure_ascii=False wird der Text so geschrieben, wie er ist, und indent=2 formatiert die Ausgabe genau wie im JavaScript-Beispiel.
JSON-Dateien lesen und schreiben
with open("product.json", "w", encoding="utf-8") as f:
json.dump(product, f, ensure_ascii=False, indent=2)
with open("product.json", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["tags"][0]) # Reisen
Zwei wichtige Punkte: Übergeben Sie ensure_ascii=False auch an json.dump, und öffnen Sie die Datei immer mit encoding="utf-8". Wenn Sie unter Windows keine Kodierung angeben, verwendet Python womöglich die Standardkodierung des Systems, und die ist nicht UTF-8; das Ergebnis ist entweder ein UnicodeEncodeError oder eine Datei mit verstümmelten Zeichen.
Die Ausgabe von print ist kein JSON
print(product)
# {'title': 'Reiseführer', 'price': 32, 'tags': ['Reisen', 'Bestseller'], 'discount': None}
Ein sehr häufiger Fehler ist es, die print-Ausgabe eines Dictionarys irgendwo als JSON einzufügen. Dieser Text ist Pythons eigene Darstellung der Daten: Er enthält einfache Anführungszeichen und None statt null, deshalb akzeptiert ihn kein JSON-Parser. Um JSON zu erzeugen, verwenden Sie immer json.dumps.
Fehlerbehandlung in Python
try:
json.loads("{'name': 'Ali'}")
except json.JSONDecodeError as e:
print(e) # Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
json.JSONDecodeError ist eine Unterklasse von ValueError, und die Attribute lineno, colno und pos geben die Position des Fehlers an. Wenn Sie mit der Bibliothek requests arbeiten, erledigt response.json() dieselbe Umwandlung für eine API-Antwort. Ein feiner Unterschied: Python akzeptiert standardmäßig NaN in der Eingabe und schreibt es auch in die Ausgabe, obwohl dieser Wert kein Standard-JSON ist; um das zu verhindern, übergeben Sie allow_nan=False an json.dumps.
Typische JSON-Fehler und was die Meldungen bedeuten
| Fehler | Ungültiges Beispiel | Meldung in JavaScript (Node.js und Chrome) | Meldung in Python |
|---|---|---|---|
| Einfache Anführungszeichen oder Schlüssel ohne Anführungszeichen | {'name': 'Ali'} | Expected property name or '}' | Expecting property name enclosed in double quotes |
| Abschließendes Komma in einem Objekt | {"a": 1,} | Expected double-quoted property name | Python 3.14: Illegal trailing comma before end of object; Python 3.12: Expecting property name enclosed in double quotes |
| Abschließendes Komma in einem Array | [1, 2,] | Unexpected token ']' | Python 3.14: Illegal trailing comma before end of array; Python 3.12: Expecting value |
| Fehlendes Komma oder Kommentar nach einem Wert | {"a": 1 "b": 2} | Expected ',' or '}' after property value | Expecting ',' delimiter |
| Ein Wert aus Python oder JavaScript | {"a": True} | Unexpected token 'T' | Expecting value |
| Zahl mit führender Null | {"phone": 0123456789} | Unexpected number | Expecting ',' delimiter |
| Nicht geschlossener String | {"a": "x} | Unterminated string | Unterminated string starting at |
| Leere Eingabe | Leerer Text | Unexpected end of JSON input | Expecting value |
Die Meldungen nennen meist auch die Position, etwa position 8 oder line 1 column 9, und das eigentliche Problem liegt oft direkt vor dieser Stelle. Beginnt eine JavaScript-Meldung mit Unexpected token '<', haben Sie wahrscheinlich statt JSON eine HTML-Seite erhalten, zum Beispiel eine 404-Fehlerseite oder eine Anmeldeseite; der Ratgeber zum Fehler Unexpected token geht diesen Fall durch. Eine mit BOM gespeicherte Datei führt in Python zum Fehler Unexpected UTF-8 BOM; öffnen Sie sie mit encoding="utf-8-sig" oder speichern Sie sie ohne BOM.
Formatieren und validieren mit dem JSON Formatter
Wenn ein langes JSON-Dokument in einer einzigen Zeile ankommt oder Sie nicht herausfinden, warum es sich nicht parsen lässt, ist der JSON Formatter der schnellste Weg. Das Tool arbeitet mit dem JSON-Parser des Browsers selbst, und die Daten verlassen Ihren Browser nicht; Sie können also auch API-Antworten mit Tokens oder Nutzerdaten bedenkenlos prüfen. Die Schritte:
- Fügen Sie das JSON in das Feld JSON-Eingabe ein; es wird sofort formatiert, und die Schaltfläche Formatieren tut dasselbe.
- Wählen Sie im Menü Einrückung zwischen 2 Leerzeichen, 4 Leerzeichen oder Tabulator.
- Ist das JSON ungültig, erscheint eine Meldung, die mit
Ungültiges JSON:beginnt und den Fehlertext des Browsers enthält, meist samt Position des Problems; mit der Tabelle oben finden Sie heraus, was er bedeutet, und beheben den Fehler. - Der Tab Baum zeigt die Daten als aufklappbaren Baum, und Alle aufklappen und Alle zuklappen öffnen oder schließen alle Zweige; sehr praktisch, um in großen Antworten einen Schlüssel zu finden.
- Um die Daten kompakt zu senden oder zu speichern, entfernt Minifizieren alle Leerzeichen und Zeilenumbrüche. Kopieren Sie das Ergebnis mit Kopieren.
Wenn Ihr Code Typen für das empfangene JSON braucht, erzeugt JSON zu Typen aus einem Beispiel Definitionen für TypeScript, Go oder Python; der Ratgeber API-Antworten in TypeScript typisieren zeigt, wie es geht.