Kurze Einführung: JSON mit Python
Jupyter Notebook dazu gibt es bei mir (sbt) auf Anfrage.
1. Was ist JSON?
JSON steht für JavaScript Object Notation.
Es ist ein einfaches Textformat, um Daten zu speichern oder zwischen Programmen auszutauschen.
JSON sieht ähnlich aus wie Python-Datenstrukturen:
{
"name": "Anna",
"alter": 25,
"hobbys": ["Lesen", "Sport", "Musik"]
}
In Python wird JSON häufig in folgende Datentypen umgewandelt:
| JSON | Python |
| Objekt {} | Dictionary dict |
| Array [] | Liste list |
| String | String str |
| Zahl | Integer oder Float |
| true / false | True / False |
| null | None |
2. JSON-Text mit json.loads() einlesen
Mit json.loads() kann ein JSON-Text in ein Python-Objekt umgewandelt werden.
loads bedeutet ungefähr: load string, also einen JSON-Text laden.
import json json_text = ''' { "name": "Anna", "alter": 25, "hobbys": ["Lesen", "Sport", "Musik"] } ''' daten = json.loads(json_text) print(daten)
Ausgabe:
{'name': 'Anna', 'alter': 25, 'hobbys': ['Lesen', 'Sport', 'Musik']}
Das Ergebnis ist ein Python-dict → Dictionary
Ein dict besteht aus Schlüssel-Wert-Paaren.
Beispiel:
{'name': 'Anna', 'alter': 25}
3. Zugriff auf einfache Elemente
Wenn das JSON-Objekt ein Dictionary ist, greift man mit dem Schlüssel auf Werte zu.
print(daten["name"]) print(daten["alter"])
Ausgabe:
Anna 25
Man kann Werte auch in Variablen speichern.
name = daten["name"] alter = daten["alter"] print(name) print(alter)
Ausgabe:
Anna 25
4. Zugriff auf Listen
JSON-Arrays werden in Python zu Listen.
In unserem Beispiel ist hobbys eine Liste.
hobbys = daten["hobbys"] print(hobbys)
Ausgabe:
['Lesen', 'Sport', 'Musik']
Auf einzelne Listenelemente greift man über den Index zu.
Wichtig: Der erste Index ist 0.
print(daten["hobbys"][0]) print(daten["hobbys"][1]) print(daten["hobbys"][2])
Ausgabe:
Lesen Sport Musik
5. Durch eine Liste laufen
Mit einer for-Schleife kann man alle Elemente einer Liste ausgeben.
for hobby in daten["hobbys"]: print(hobby)
Ausgabe:
Lesen Sport Musik
6. JSON mit mehreren Objekten in einer Liste
Häufig besteht JSON aus einer Liste von Objekten.
Nach dem Einlesen ist das eine Python-Liste mit mehreren Dictionaries.
json_text = ''' [ { "name": "Anna", "alter": 25 }, { "name": "Ben", "alter": 30 }, { "name": "Clara", "alter": 28 } ] ''' personen = json.loads(json_text) print(personen)
Ausgabe:
[{'name': 'Anna', 'alter': 25}, {'name': 'Ben', 'alter': 30}, {'name': 'Clara', 'alter': 28}]
Zugriff auf das erste Objekt in der Liste:
print(personen[0])
Ausgabe:
{'name': 'Anna', 'alter': 25}
Zugriff auf einzelne Werte in den Objekten:
print("Name der 1. Person: ", personen[0]["name"]) print("Alter der 2. Person: ", personen[1]["alter"])
Ausgabe:
Name der 1. Person: Anna Alter der 2. Person: 30
7. Durch eine Liste von Objekten laufen
Mit einer Schleife kann man jedes Dictionary in der Liste einzeln verarbeiten.
for person in personen: print(person["name"])
Ausgabe:
Anna Ben Clara
Man kann auch mehrere Werte ausgeben.
for person in personen: print(person["name"], person["alter"])
Ausgabe:
Anna 25 Ben 30 Clara 28
8. Verschachtelte Strukturen
JSON kann verschachtelt sein.
Das bedeutet:
- In Objekten können Listen liegen.
- In Listen können Objekte liegen.
- In Listen können weitere Listen liegen.
json_text = ''' { "klasse": "4xKS", "schueler": [ { "name": "Anna", "noten": [1, 2, 2] }, { "name": "Ben", "noten": [3, 2, 4] } ] } ''' daten = json.loads(json_text) print(daten)
Ausgabe:
{'klasse': '4xKS', 'schueler': [{'name': 'Anna', 'noten': [1, 2, 2]}, {'name': 'Ben', 'noten': [3, 2, 4]}]}
9. Zugriff auf verschachtelte Elemente
Zugriff auf den Klassennamen:
print(daten["klasse"])
Ausgabe:
4xKS
Zugriff auf die Liste der Schüler:
print(daten["schueler"])
Ausgabe:
[{'name': 'Anna', 'noten': [1, 2, 2]}, {'name': 'Ben', 'noten': [3, 2, 4]}]
Zugriff auf den ersten Schüler:
print(daten["schueler"][0])
Ausgabe:
{'name': 'Anna', 'noten': [1, 2, 2]}
Zugriff auf den Namen des ersten Schülers:
print(daten["schueler"][0]["name"])
Ausgabe:
Anna
Zugriff auf die erste Note des ersten Schülers:
print(daten["schueler"][0]["noten"][0])
Ausgabe:
1
Die Struktur kann man so lesen:
daten["schueler"][0]["noten"][0]
Bedeutung:
daten["schueler"] -> Schülerliste [0] -> erster Schüler ["noten"] -> Notenliste dieses Schülers [0] -> erste Note
10. Listen in Listen
Auch Listen können weitere Listen enthalten.
Ein Beispiel dafür ist eine Matrix.
json_text = ''' { "matrix": [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] } ''' daten = json.loads(json_text) print(daten)
Ausgabe:
{'matrix': [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}
Zugriff auf die erste innere Liste:
print(daten["matrix"][0])
Ausgabe:
[1, 2, 3]
Zugriff auf ein einzelnes Element:
print(daten["matrix"][1][2])
Ausgabe:
6
Erklärung:
daten["matrix"] -> gesamte Matrix [1] -> zweite innere Liste: [4, 5, 6] [2] -> drittes Element dieser Liste: 6
11. JSON mit json.dumps() erzeugen
Mit json.dumps() kann ein Python-Objekt wieder in JSON-Text umgewandelt werden.
dumps bedeutet ungefähr: dump string, also als JSON-Text ausgeben.
person = { "name": "Anna", "alter": 25, "hobbys": ["Lesen", "Sport", "Musik"] } json_text = json.dumps(person) print(json_text)
Ausgabe:
{"name": "Anna", "alter": 25, "hobbys": ["Lesen", "Sport", "Musik"]}
12. JSON schöner formatieren
Mit indent kann man JSON lesbarer ausgeben.
json_text = json.dumps(person, indent=2) print(json_text)
Ausgabe:
{
"name": "Anna",
"alter": 25,
"hobbys": [
"Lesen",
"Sport",
"Musik"
]
}
13. Umlaute korrekt ausgeben
Mit ensure_ascii=False bleiben Umlaute lesbar.
person = { "name": "Jörg", "stadt": "München" } json_text = json.dumps(person, indent=2, ensure_ascii=False) print(json_text)
Ausgabe:
{
"name": "Jörg",
"stadt": "München"
}
14. Sicherer Zugriff mit .get()
Wenn man nicht sicher ist, ob ein Schlüssel existiert, kann man .get() verwenden.
Wenn der Schlüssel nicht existiert, entsteht kein Fehler. Stattdessen wird None zurückgegeben.
person = { "name": "Anna", "alter": 25 } name = person.get("name") if name: print(name) else: print("Name nicht gefunden") adresse = person.get("adresse") if adresse: print(adresse) else: print("Adresse nicht vorhanden")
Ausgabe:
Anna Adresse nicht vorhanden
Man kann auch einen Standardwert angeben.
print(person.get("adresse", "Keine Adresse vorhanden"))
Ausgabe:
Keine Adresse vorhanden
15. Komplettes Beispiel
In diesem Beispiel gibt es eine Firma mit mehreren Mitarbeitern.
Jeder Mitarbeiter hat wiederum eine Liste von Abteilungen.
json_text = ''' { "firma": "Beispiel GmbH", "mitarbeiter": [ { "name": "Anna", "abteilungen": ["IT", "Support"] }, { "name": "Ben", "abteilungen": ["Vertrieb", "Marketing"] } ] } ''' daten = json.loads(json_text) print("Firma:", daten["firma"]) for mitarbeiter in daten["mitarbeiter"]: print("Name:", mitarbeiter["name"]) for abteilung in mitarbeiter["abteilungen"]: print(" -", abteilung)
Ausgabe:
Firma: Beispiel GmbH Name: Anna - IT - Support Name: Ben - Vertrieb - Marketing
16. Zusammenfassung
json.loads()wandelt JSON-Text in Python-Objekte um.json.dumps()wandelt Python-Objekte in JSON-Text um.- JSON-Objekte
{}werden zu Python-Dictionaries. - JSON-Listen
[]werden zu Python-Listen. - Zugriff auf Dictionary-Werte erfolgt mit Schlüsseln:
daten["name"]
- Zugriff auf Listenelemente erfolgt mit Indizes:
liste[0]
- Bei verschachtelten Strukturen kombiniert man beide Zugriffsarten:
daten["schueler"][0]["noten"][1]
Das bedeutet:
- Nimm aus daten die Schülerliste,
- daraus den ersten Schüler,
- daraus die Notenliste,
- daraus die zweite Note.