JSON und Python sprechen dieselben Formen
JSON ist das Standardformat für APIs, Config-Dateien und Datenaustausch im Web. Zum Glück für Python-Entwicklerinnen entspricht ein JSON-Objekt direkt einem Python-Dict, ein JSON-Array einer Liste, ein JSON-String einem str. Diese enge Übereinstimmung ist der Grund, warum JSON in Python zu lesen und zu schreiben eine Zweizeilen-Operation ist.
Das Standardbibliothek-Modul json kümmert sich um beide Richtungen.
Einen JSON-String parsen
json.loads(text) — „load string“ — nimmt einen JSON-formatierten String und liefert das dargestellte Python-Objekt:
Das Ergebnis ist ein schlichtes Dict. Du greifst wie bei jedem Dict auf Schlüssel zu — keine JSON-Hülle, keine .parse()-Methode am Ergebnis.
Ist der String kein gültiges JSON, wirft json.loads json.JSONDecodeError. Die Fehlermeldung enthält Zeile und Spalte des Problems, meist genug, um ein fehlendes Komma oder ein unmaskiertes Anführungszeichen zu finden.
JSON als String schreiben
json.dumps(data) — „dump string“ — macht das Gegenteil: ein Python-Objekt in einen JSON-String:
Pythons True, False und None werden automatisch zu JSONs true, false und null. Zahlen und Strings gehen unverändert durch. Listen werden Arrays, Dicts werden Objekte.
Pretty-Printing
Die Standardausgabe von json.dumps ist kompakt — gut fürs Netz, hart für Menschen. Übergib indent=2 für etwas Lesbareres:
Ein paar weitere dumps-Optionen, die es wert sind:
sort_keys=True— sortiert Objekt-Schlüssel alphabetisch. Nützlich für deterministische Ausgabe (Configs, Test-Fixtures, Diffs).ensure_ascii=False— schreibt Nicht-ASCII-Zeichen (é, ü, 中) als sie selbst statt als\u-Escapes. Meist die richtige Wahl für UTF-8-Dateien.separators=(",", ":")— möglichst kompakte Ausgabe. Kombiniert mitensure_ascii=Falsegibt das kompaktestes UTF-8-JSON.
JSON aus einer Datei lesen
json.load(file) — ohne s — liest direkt aus einem Dateiobjekt. Das übliche Muster ist die Kombi mit with open:
import json
with open("config.json") as f:
config = json.load(f)
print(config["version"])
Du musst die Datei nicht erst in einen String lesen; json.load streamt durch das Dateiobjekt.
JSON in eine Datei schreiben
json.dump(data, file) ist das datei-schreibende Gegenstück:
import json
data = {"created": "2026-01-01", "items": [1, 2, 3]}
with open("state.json", "w") as f:
json.dump(data, f, indent=2)
Die indent-Option wirkt auch hier. Öffne die entstandene Datei, und du siehst ein sauber formatiertes JSON-Dokument.
Eine JSON-API-Antwort lesen
Die meisten HTTP-Bibliotheken liefern dir Bytes oder Text; du rufst json.loads, um sie in nutzbare Daten zu verwandeln:
import json
import urllib.request
with urllib.request.urlopen("https://api.example.com/users/1") as response:
text = response.read().decode("utf-8")
user = json.loads(text)
print(user["name"])
Die requests-Bibliothek (separat behandelt) spart einen Schritt — sie hat eine .json()-Methode auf der Antwort, die json.loads für dich aufruft.
Was JSON darstellen kann und was nicht
JSONs Typsystem ist enger als das von Python. Die Zuordnung in beide Richtungen:
| Python | JSON |
|---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
Tupel kommen als Listen zurück — die Tupelheit geht verloren. Sets, eigene Klassen und datetime-Objekte lassen sich standardmäßig nicht serialisieren; du bekommst TypeError: Object of type X is not JSON serializable.
datetime und eigene Objekte behandeln
Zwei häufige Wege.
Vorher in eine JSON-taugliche Struktur umwandeln. Mach die Transformation in deinem Code, dann serialisier ein schlichtes Dict:
Übergib eine default=-Funktion. json.dumps ruft sie für jeden Wert auf, den es nicht serialisieren kann:
Beim Zurücklesen musst du diese ISO-Strings selbst in datetime umwandeln — JSON erinnert sich nicht, was sie ursprünglich waren.
Einen Dict-Rundtrip durch JSON
Eine schnelle Plausibilitätsprüfung, ob Dicts die Runde überstehen:
Die Werte sind gleich, aber es sind verschiedene Objekte. Das willst du oft — json.dumps + json.loads ist eine günstige Art, eine Tiefenkopie jeder JSON-kompatiblen Struktur zu machen.
Ein realistisches Beispiel
Ein kleines Skript, das eine JSON-Config lädt, ein Feld aktualisiert und sie zurückspeichert:
import json
from pathlib import Path
config_path = Path("settings.json")
# Load (with a default if the file doesn't exist).
if config_path.exists():
config = json.loads(config_path.read_text())
else:
config = {"theme": "dark", "last_opened": None}
# Update.
config["last_opened"] = "2026-01-15"
# Save, pretty-printed.
config_path.write_text(json.dumps(config, indent=2, ensure_ascii=False))
Das ist ein vollständiger „Lesen, Ändern, Schreiben“-JSON-Zyklus in einem Dutzend Zeilen.
Ein paar Gewohnheiten
- Nutz
with open(...)für Dateien, immer. JSON ist nur Text; alle Datei-Regeln gelten. - Bevorzug
indent=2für Dateien, die Menschen lesen — Config, Fixtures, exportierte Daten. Lass es bei Netzverkehr weg, wo Kompaktheit zählt. - Setz
ensure_ascii=Falsefür UTF-8-Ausgabe, damit Namen mit Akzenten oder nicht-lateinischen Zeichen lesbar bleiben. - Validier mit
try/except json.JSONDecodeErrorbeim Parsen von Daten, die du nicht selbst erzeugt hast.
Als Nächstes
JSON verarbeitet Schlüssel-Wert-Daten. Das nächste Werkzeug im selben Kapitel ist CSV — Pythons eingebaute Unterstützung für das tabellarische Format hinter den meisten Tabellenkalkulations-Exporten.
Häufig gestellte Fragen
Wie parse ich JSON in Python?
Nutz json.loads(text) für einen JSON-String oder json.load(file) für ein Dateiobjekt. Beide liefern ein Python-Dict (oder eine Liste, je nach JSON). Beispiel: data = json.loads('{"name": "Rosa"}') — data['name'] ist 'Rosa'.
Wie wandle ich ein Python-Dictionary in JSON um?
json.dumps(my_dict) liefert einen JSON-String. json.dump(my_dict, file) schreibt direkt in ein Dateiobjekt. Übergib indent=2 für hübsch formatierte Ausgabe: json.dumps(data, indent=2).
Was ist der Unterschied zwischen json.loads und json.load?
loads (mit s) nimmt einen String. load (ohne s) nimmt ein Dateiobjekt. Dasselbe gilt für dumps vs. dump. Das s steht für String; die einfachste Merkhilfe.
Wie gehe ich mit Daten und eigenen Objekten in JSON um?
JSON hat keinen Datumstyp; übergib Daten als ISO-8601-Strings und parse sie manuell zurück. Für eigene Klassen: entweder übergib default= an json.dumps, das eine JSON-taugliche Darstellung zurückgibt, oder wandle vorher selbst in ein dict um.