Direkt zum Hauptinhalt springen
eLearner.app
Modul 8 · Lektion 1 von 429/36 im Kurs~10 min
Lektionen des Moduls (1/4)

JSON: Serialisierung und Parsen

JSON ist das am weitesten verbreitete Datenaustauschformat. Das Modul json der Standardbibliothek verarbeitet es nativ.

Von Python zu JSON: dumps

json.dumps(object) serialisiert ein Python-Objekt in einen JSON-String.

Python
import json

dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'

json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sorted

Von JSON zu Python: loads

json.loads(string) parst einen JSON-String und gibt Python-Objekte zurück.

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

Typ-Zuordnung (mapping)

JSONPython
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

Aus Datei: dump / load

Python
with open("config.json", "w") as f:
    json.dump(dati, f, indent=2)

with open("config.json") as f:
    dati = json.load(f)

Ohne das nachgestellte "s" arbeiten sie auf Dateien (file-like), mit dem "s" auf Strings.

Nicht-serialisierbare Typen: default

datetime, set und deine benutzerdefinierten Klassen sind standardmäßig nicht serialisierbar:

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

Du kannst eine default-Funktion übergeben, die angibt, wie sie umgewandelt werden sollen:

Python
def converti(obj):
    if isinstance(obj, datetime.datetime):
        return obj.isoformat()
    if isinstance(obj, set):
        return list(obj)
    raise TypeError(f"non serializzabile: {type(obj)}")

json.dumps({"ora": datetime.datetime.now()}, default=converti)

JSON- und Dateioperationen

Die Standardbibliothek stellt auch json.dump() und json.load() (ohne das 's') zur Verfügung, um JSON-Daten direkt in und aus Dateien zu schreiben und zu lesen, was sich natürlich mit Kontextmanagern kombinieren lässt:

Python
with open("data.json", "w") as f:
    json.dump(data, f)

Probiere es aus

Übung#python.m8.l1.e1
Versuche: 0Wird geladen…

Weise das zu JSON serialisierte `data = {'nome': 'Ada', 'anni': 36}` mit indent=2 der Variablen `json_str` zu. Evaluiere `json_str`.

Editor wird geladen…
Hinweis anzeigen

json.dumps(data, indent=2)

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#python.m8.l1.e2
Versuche: 0Wird geladen…

Analysiere den JSON-String s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]' mit json.loads in data und berechne die Summe der 'v'-Werte in total. Evaluiere total.

Editor wird geladen…
Hinweis anzeigen

json.loads gibt eine Liste von Dictionaries zurück.

Lösung nach 3 Versuchen verfügbar

Zusätzliche Herausforderung

Übung#python.m8.l1.e3
Versuche: 0Wird geladen…

Dekodiere den JSON-String `json_data = '{"name": "Alice", "age": 30}'` mit `json.loads` in ein Python-Dictionary. Extrahiere den mit dem Schlüssel `'name'` verknüpften Wert und speichere ihn in `user_name`. Evaluiere schließlich `user_name`.

Editor wird geladen…
Hinweis anzeigen

Verwende json.loads(json_data) zum Dekodieren, greife dann über data['name'] darauf zu.

Lösung nach 3 Versuchen verfügbar