Ga naar hoofdinhoud

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"
]
}