33.5 Das Datenaustauschformat JSON – json 

Das ursprünglich für JavaScript entwickelte Datenformat JSON[ 144 ](für JavaScript Object Notation) hat sich zu einem Quasi-Standard für den einfachen Datenaustausch zwischen Webanwendungen entwickelt und konkurriert damit gewissermaßen mit XML. Im Gegensatz zur Markup-Sprache XML speichert JSON Daten in Form von gültigem JavaScript-Code. Trotzdem gibt es JSON-Parser für alle verbreiteten Programmiersprachen, selbstverständlich auch für Python.
Ein in JSON repräsentiertes Objekt kann aus den in Tabelle 33.10 aufgelisteten Datentypen zusammengestellt werden, die jeweils ein bedeutungsgleiches Ebenbild in Python finden.
JSON-Datentyp | Notation | Korrespondierender Python-Datentyp |
---|---|---|
Object | {} | dict |
Array | [] | list |
Number |
12 12.34 |
int float |
String | "" | str |
Value |
true false null |
bool bool NoneType |
Tabelle 33.10 Datentypen in JSON und ihre Ebenbilder in Python
Analog zu Dictionarys und Listen können Objects und Arrays in JSON weitere Instanzen enthalten, insbesondere weitere Objects bzw. Arrays.
In der Standardbibliothek existiert das Modul json, das Python-Instanzen ins JSON-Format serialisieren bzw. aus dem JSON-Format erstellen kann. Dazu erzeugen wir zunächst einen Datensatz, der in den folgenden Beispielen verwendet werden soll:
>>> eintrag = {
... "Vorname" : "Donald",
... "Nachname" : "Duck",
... "Adresse" : ["Erpelweg", 12, 12345, "Entenhausen"],
... "Alter" : 81
... }
Ähnlich wie pickle bietet das Modul json die Funktionen dump, dumps bzw. load und loads an, um Daten zu speichern bzw. zu laden. Zum Ausführen der folgenden Beispiele muss das Modul json zunächst eingebunden werden:
>>> import json
Die Funktion dump bekommt eine Python-Instanz übergeben, die aus den in der vorangegangenen Tabelle aufgeführten Datentypen bestehen darf, und speichert diese in ein zum Schreiben geöffnetes Dateiobjekt.
>>> with open("eintrag.json", "w") as f:
... json.dump(eintrag, f)
Beachten Sie, dass JSON ein menschenlesbares Datenformat ist. Das Dateiobjekt muss daher nicht wie bei pickle im Binärmodus geöffnet werden. Analog zu dump gibt die Funktion dumps die JSON-Repräsentation einer Instanz als String zurück.
>>> s = json.dumps(eintrag)
>>> s
'{"Vorname": "Donald", "Nachname": "Duck", "Adresse": ["Erpelweg", 12, 12345, "Entenhausen"], "Alter": 81}'
Die gespeicherten Daten können nun mit den korrespondierenden Funktionen load und loads wieder eingelesen und in eine Python-Instanz zurückkonvertiert werden:
>>> with open("eintrag.json", "r") as f:
... print(json.load(f))
{'Vorname': 'Donald', 'Nachname': 'Duck', 'Adresse': ['Erpelweg', 12, 12345, 'Entenhausen'], 'Alter': 81}
>>> json.loads(s)
{'Vorname': 'Donald', 'Nachname': 'Duck', 'Adresse': ['Erpelweg', 12, 12345, 'Entenhausen'], 'Alter': 81}