Menu

Python-JSON: JSON mit dem json-Modul lesen, schreiben und parsen

Wie du JSON in Python liest und schreibst — loads, dumps, aus Dateien lesen, Pretty-Print und die Randfälle, die bei echten Daten vorkommen.

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:

main.py
Output
Click Run to see the output here.

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:

main.py
Output
Click Run to see the output here.

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:

main.py
Output
Click Run to see the output here.

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 mit ensure_ascii=False gibt 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:

PythonJSON
dictobject
list, tuplearray
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

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:

main.py
Output
Click Run to see the output here.

Übergib eine default=-Funktion. json.dumps ruft sie für jeden Wert auf, den es nicht serialisieren kann:

main.py
Output
Click Run to see the output here.

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:

main.py
Output
Click Run to see the output here.

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=2 für Dateien, die Menschen lesen — Config, Fixtures, exportierte Daten. Lass es bei Netzverkehr weg, wo Kompaktheit zählt.
  • Setz ensure_ascii=False für UTF-8-Ausgabe, damit Namen mit Akzenten oder nicht-lateinischen Zeichen lesbar bleiben.
  • Validier mit try/except json.JSONDecodeError beim 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.

Lerne mit Coddy zu programmieren

LOS GEHT'S