11d JSON
Alles wat je programma in variabelen bewaart, is weg zodra het stopt. Een highscore, een lijst met taken of de gegevens van een klas wil je vaak bewaren voor de volgende keer. Daarvoor zet je ze om naar tekst, in een vorm die JSON heet. In les 11e 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 11d.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"
]
}