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.

Direkt ausprobieren: JSON Formatter

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.json in Node.js-Projekten oder composer.json in PHP.
  • Datenspeicherung: im localStorage des 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:

TypBeispielBeschreibung
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.2e6Ganzzahl oder Dezimalzahl, ohne Anführungszeichen
boolean (Wahrheitswert)true, falseNur in Kleinbuchstaben
nullnullKein 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, True und None sind kein gültiges JSON.
  • Zahlen dürfen nicht mit einer Null beginnen: 012 ist 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, \n für einen Zeilenumbruch und \uXXXX fü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
JSONPythonJavaScript
objectdictObject
arraylistArray
stringstrString
numberint oder floatNumber
true / falseTrue / Falsetrue / false
nullNonenull

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

FehlerUngültiges BeispielMeldung 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 namePython 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 valueExpecting ',' delimiter
Ein Wert aus Python oder JavaScript{"a": True}Unexpected token 'T'Expecting value
Zahl mit führender Null{"phone": 0123456789}Unexpected numberExpecting ',' delimiter
Nicht geschlossener String{"a": "x}Unterminated stringUnterminated string starting at
Leere EingabeLeerer TextUnexpected end of JSON inputExpecting 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:

  1. Fügen Sie das JSON in das Feld JSON-Eingabe ein; es wird sofort formatiert, und die Schaltfläche Formatieren tut dasselbe.
  2. Wählen Sie im Menü Einrückung zwischen 2 Leerzeichen, 4 Leerzeichen oder Tabulator.
  3. 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.
  4. 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.
  5. 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.

Häufige Fragen

Was ist JSON, und worin unterscheidet es sich von einem JavaScript-Objekt?

JSON ist ein Textformat zum Speichern und Austauschen von Daten, dessen Syntax von JavaScript-Objekten stammt, aber strenger ist: Schlüssel müssen in doppelten Anführungszeichen stehen, Kommentare und abschließende Kommas sind nicht erlaubt, und Werte wie undefined oder Funktionen gibt es darin nicht.

Warum schreibt Python ü in JSON als \u00fc?

Weil json.dumps standardmäßig ensure_ascii=True verwendet und jedes Nicht-ASCII-Zeichen maskiert. Die Ausgabe ist gültig; für lesbaren Text übergeben Sie ensure_ascii=False und schreiben die Datei mit encoding="utf-8".

Kann man in einer JSON-Datei Kommentare schreiben?

Nein. Standard-JSON kennt keine Kommentare, und JSON.parse und json.loads melden einen Fehler, sobald sie auf einen treffen. Manche Werkzeuge, etwa die Einstellungen von VS Code, akzeptieren ein erweitertes Format mit Kommentaren, doch das ist kein Standard-JSON.

Was ist der Unterschied zwischen json.loads und json.load in Python?

json.loads wandelt einen JSON-String in Python-Daten um, json.load liest direkt aus einer geöffneten Datei. Entsprechend gibt json.dumps einen String zurück, und json.dump schreibt die Daten in eine Datei.
Direkt ausprobieren: JSON Formatter