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.
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 sortedVon JSON zu Python: loads
json.loads(string) parst einen JSON-String und gibt Python-Objekte zurück.
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"] # 'Ada'
type(d) # <class 'dict'>Typ-Zuordnung (mapping)
| JSON | Python |
|---|---|
object | dict |
array | list |
string | str |
number | int / float |
true | True |
false | False |
null | None |
Aus Datei: dump / load
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:
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializableDu kannst eine default-Funktion übergeben, die angibt, wie sie umgewandelt werden sollen:
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:
with open("data.json", "w") as f:
json.dump(data, f)Probiere es aus
Weise das zu JSON serialisierte `data = {'nome': 'Ada', 'anni': 36}` mit indent=2 der Variablen `json_str` zu. Evaluiere `json_str`.
Hinweis anzeigen
json.dumps(data, indent=2)
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
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.
Hinweis anzeigen
json.loads gibt eine Liste von Dictionaries zurück.
Lösung nach 3 Versuchen verfügbar
Zusätzliche Herausforderung
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`.
Hinweis anzeigen
Verwende json.loads(json_data) zum Dekodieren, greife dann über data['name'] darauf zu.
Lösung nach 3 Versuchen verfügbar