Python JSON: Encoding, Decoding und Datei-Handling – Ein praktischer Leitfaden
Python JSON: Encoding, Decoding und Datei-Handling – Ein praktischer Leitfaden
Was ist JSON in Python?
JSON – kurz für JavaScript Object Notation – ist das am weitesten verbreitete textbasierte Datenaustauschformat. In Python ordnet es sich direkt nativen Datenstrukturen zu: Objekte werden zu dicts, Arrays zu lists, Strings, Zahlen, Booleans und null übersetzen sich zu str, int/float, bool und None. Das json-Modul in der Standardbibliothek handhabt alle Konvertierungen.
JSON-Bibliothek in Python
Importieren Sie das Modul einmal in Ihrem Skript:
import json
Das Modul bietet vier Kernmethoden:
| Methode | Beschreibung |
|---|---|
| dumps() | Konvertiert ein Python-Objekt in einen JSON-String. |
| dump() | Schreibt einen JSON-String direkt in ein Dateiobjekt. |
| loads() | Parst einen JSON-String in ein Python-Objekt. |
| load() | Liest und parst eine JSON-Datei in ein Python-Objekt. |
Python zu JSON (Encoding)
Encoding ist der Prozess der Konvertierung von Python-Datentypen in JSON. Das Standard-Mapping ist unten gezeigt:
| Python | JSON |
|---|---|
| dict | Object |
| list | Array |
| str/unicode | String |
| int/long | Number (int) |
| float | Number (real) |
| True | true |
| False | false |
| None | null |
Beispiel mit json.dumps():
import json
x = {
"name": "Ken",
"age": 45,
"married": True,
"children": ("Alice", "Bob"),
"pets": ["Dog"],
"cars": [
{"model": "Audi A1", "mpg": 15.1},
{"model": "Zeep Compass", "mpg": 18.1}
]
}
# Pretty-Print mit sortierten Keys
sortierter_string = json.dumps(x, indent=4, sort_keys=True)
print(sortierter_string)
Ausgabe:
{
"age": 45,
"cars": [
{
"model": "Audi A1",
"mpg": 15.1
},
{
"model": "Zeep Compass",
"mpg": 18.1
}
],
"children": [
"Alice",
"Bob"
],
"married": true,
"name": "Ken",
"pets": [
"Dog"
]
}
Einen JSON-Objekt in eine Datei zu schreiben ist mit json.dump() unkompliziert:
with open('json_datei.json', 'w') as datei_schreiben:
json.dump(x, datei_schreiben, indent=4, sort_keys=True)
Nach Ausführung des Skripts enthält json_datei.json die serialisierten Daten.
JSON zu Python (Decoding)
Decoding kehrt das Mapping um und wandelt einen JSON-String oder eine Datei zurück in native Python-Objekte. Die Konvertierungstabelle spiegelt die Encoding-Tabelle wider:
| JSON | Python |
|---|---|
| Object | dict |
| Array | list |
| String | str |
| Number (int) | int |
| Number (real) | float |
| true | True |
| false | False |
| null | None |
Beispiel mit json.loads():
import json
personen_daten = '{"person": {"name": "Kenn", "sex": "male", "age": 28}}'
obj = json.loads(personen_daten)
print(obj)
print(type(obj))
print(obj.get('person'))
Ausgabe:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
<class 'dict'>
{'name': 'Kenn', 'sex': 'male', 'age': 28}
JSON-Datei direkt lesen:
with open('json_datei.json') as f:
daten = json.load(f)
print(daten)
Ausgabe:
{'name': 'Ken', 'age': 45, ...}
Kompaktes und Pretty-Print Encoding
Für Netzwerkübertragung entfernt kompaktes Encoding Whitespace:
lst = ['a', 'b', 'c', {"4": 5, "6": 7}]
kompakt = json.dumps(lst, separators=(',', ':'))
print(kompakt)
Ausgabe:
["a","b","c",{"4":5,"6":7}]
Für menschliche Lesbarkeit nutzt Pretty-Printing Einrückung:
dic = {"a": 4, "b": 5}
pretty = json.dumps(dic, indent=4, separators=(',', ': '))
print(pretty)
Ausgabe:
{
"a": 4,
"b": 5
}
Komplexe Objekte encodieren
complex-Zahl zu handhaben, liefern Sie eine default-Funktion:
def complex_encode(o):
if isinstance(o, complex):
return [o.real, o.imag]
raise TypeError(f"{repr(o)} ist nicht JSON-serialisierbar")
print(json.dumps(4 + 5j, default=complex_encode))
Ausgabe:
[4.0, 5.0]
Komplexe Objekte decodieren
Verwenden Sie object_hook, um einen benutzerdefinierten Marker zu erkennen und die komplexe Zahl wiederherzustellen:
def is_complex(obj):
if "__complex__" in obj:
return complex(obj["real"], obj["img"])
return obj
complex_obj = json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook=is_complex)
print(complex_obj)
Ausgabe:
(4+5j)
Serialisierungs- & Deserialisierungs-Klassen
Die JSONEncoder und JSONDecoder Klassen bieten feinkörnige Kontrolle:
JSONEncoder.default(o)– überschreiben, um benutzerdefinierte Objekte zu serialisieren.JSONEncoder.encode(o)– gibt einen JSON-String zurück.JSONEncoder.iterencode(o)– iteriert über den Ausgabestring.JSONDecoder.decode(s)– parst einen JSON-String.JSONDecoder.raw_decode(s)– parst ab einem gegebenen Index.
Beispiel:
from json.encoder import JSONEncoder
print(JSONEncoder().encode({"farbe": ["rot", "gelb", "grün"]}))
JSON von einer URL abrufen
Verwenden Sie requests, um einen Live-JSON-Feed herunterzuladen (z. B. CityBike NYC):
import json, requests
response = requests.get("https://feeds.citibikenyc.com/stations/stations.json")
bike_dict = json.loads(response.text)
print(bike_dict['stationBeanList'][0])
Ausgabe:
{ 'id': 487, 'stationName': 'E 20 St & FDR Drive', 'availableDocks': 24, ... }
JSON-Exceptions behandeln
Die primäre Exception ist json.JSONDecodeError, eine Subklasse von ValueError. Beispiel-Handling:
try:
with open('bad.json') as f:
daten = json.load(f)
except json.JSONDecodeError as e:
print(f"Schlechtes JSON: {e}")
Spezielle numerische Werte
RFC 8259 erlaubt keine Infinity oder NaN, aber der Python-Encoder repräsentiert sie als Strings:
print(json.dumps(float('inf')))
print(json.dumps(float('nan')))
Ausgabe:
Infinity NaN
Wiederholte Keys in JSON
Wenn ein Key mehrfach vorkommt, behält Pythons json.loads() nur das letzte Vorkommen:
json.loads('{"a": 1, "a": 2, "a": 3}') # -> {'a': 3}
Kommandozeilen-Tools
Das json.tool-Modul formatiert und validiert JSON von der Kommandozeile:
$ echo '{"name": "König Arthur"}' | python3 -m json.tool
{
"name": "König Arthur"
}
Vorteile von JSON in Python
- Native Unterstützung via
json-Modul. - Menschenlesbar mit Pretty-Printing.
- Weit verbreitet für APIs, Konfiguration und Datenspeicherung.
- Sprachenunabhängig und leichtgewichtig.
Einschränkungen
- Unterstützt keine benutzerdefinierten Datentypen ohne custom encoder.
- Maximale Rekursionstiefe begrenzt tief verschachtelte Strukturen.
- Große Dokumente können speicherintensiv sein, um vollständig zu laden.
Python JSON Cheat Sheet
| Funktion | Beschreibung |
|---|---|
| json.dumps(obj) | Python-Objekt in JSON-String serialisieren. |
| json.dump(obj, datei) | JSON-String in Datei schreiben. |
| json.dumps(obj, separators=(",", ":")) | Kompakte Darstellung ohne Leerzeichen. |
| json.dumps(obj, indent=4) | Pretty-printed JSON mit Einrückung. |
| json.dumps(obj, sort_keys=True) | Dictionary-Keys alphabetisch sortieren. |
| json.dumps(obj, default=custom) | Nicht unterstützte Objekte encodieren. |
| JSONEncoder().encode(obj) | Manuelle Serialisierung via Encoder-Klasse. |
| json.loads(s) | JSON-String in Python-Objekt parsen. |
| json.loads(s, object_hook=custom) | Benutzerdefinierte Deserialisierungslogik. |
| JSONDecoder().decode(s) | Manuelle Deserialisierung via Decoder-Klasse. |
Python
- Python-Datentypen meistern: Praxisleitfaden
- Python-Operatoren meistern: Umfassender Leitfaden
- Pythons While-Schleife meistern: Syntax, Beispiele & Best Practices
- Python pass-Statement meistern: Praxisleitfaden
- Python-Funktionsargumente meistern: Positional, Keyword & Default-Parameter
- Python-Dictionaries meistern: Erstellung, Manipulation und fortgeschrittene Techniken
- Python File I/O: Dateioperationen, Lesen, Schreiben und Verwaltung meistern
- Dateien in Java mit BufferedReader lesen – Praktischer Leitfaden mit Beispielen
- Datei- und Verzeichnisexistenz in Python prüfen – Ein praktischer Leitfaden
- Python Datei-E/A: Eingabe- und Ausgabeoperationen meistern