14e JSON
In les 14d haalde je met split een naam en een score uit elke regel. Voor
een lijst met dictionaries, met in elke dictionary vier of vijf sleutels,
wordt dat veel knippen en plakken. Daarvoor bestaat JSON: een vorm van
tekst waarin Python je gegevens in één keer opschrijft, en ook in één keer
weer inleest. In les 14f schrijf je die tekst in een bestand.
Van dictionary naar JSON
JSON is tekst die er bijna precies zo uitziet als een Python-dictionary of
-lijst. De module json zet je gegevens om naar die tekst met
json.dumps():
import json
leerling = {"naam": "Sara", "klas": "3B", "actief": True, "hobby": None}
tekst = json.dumps(leerling, indent=2)
print(tekst)
Uitvoer:
{
"naam": "Sara",
"klas": "3B",
"actief": true,
"hobby": null
}
Met indent=2 krijg je elke sleutel op een eigen regel, twee spaties
ingesprongen. Kijk ook naar de kleine verschillen met Python: JSON schrijft
true en false met een kleine letter, None heet null, en tekst staat
altijd tussen dubbele aanhalingstekens.
Van JSON terug naar een dictionary
Andersom doet json.loads() het: van tekst naar een dictionary of lijst
waar je mee verder kunt.
import json
tekst = '{"naam": "Alex", "punten": [8, 9, 7]}'
gegevens = json.loads(tekst)
print(gegevens["naam"])
print(sum(gegevens["punten"]))
Uitvoer:
Alex
24
De s aan het eind van dumps en loads staat voor string: ze werken
met tekst. Voor bestanden zijn er json.dump() en json.load(), zonder
s.
Er gaat iets mis
Enkele aanhalingstekens in JSON
import json
json.loads("{'naam': 'Sara'}")
Uitvoer:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Python accepteert enkele aanhalingstekens, JSON niet. Zet in JSON-tekst altijd dubbele aanhalingstekens om sleutels en tekst.
Een getal als sleutel komt terug als tekst
import json
kamers = {1: "keuken", 2: "zolder"}
terug = json.loads(json.dumps(kamers))
print(terug)
Uitvoer:
{'1': 'keuken', '2': 'zolder'}
In JSON is elke sleutel tekst. Na het inlezen zoek je dus op met
terug["1"]; terug[1] geeft een KeyError.
Opdracht 14e.1: Jij in JSON
Maak een dictionary over jezelf met minstens vier sleutels, waarvan één een
lijst is (bijvoorbeeld je hobby's). Print hem als JSON met indent=2.
import json # Schrijf hier je code
Klik hier voor een tip.
print(json.dumps(ik, indent=2)). Een lijst als waarde schrijf je
tussen blokhaken: "hobby's": ["tekenen", "voetbal"].
Klik hier voor de oplossing.
import json
ik = {
"naam": "Alex",
"leeftijd": 15,
"klas": "3B",
"hobby's": ["tekenen", "voetbal"],
}
print(json.dumps(ik, indent=2))
Uitvoer:
{
"naam": "Alex",
"leeftijd": 15,
"klas": "3B",
"hobby's": [
"tekenen",
"voetbal"
]
}