Direct naar de hoofdinhoud
Module 8 · Les 1 van 429/36 in de cursus~10 min
Modulelessen (1/4)

JSON: serialiseren en parseren

JSON is het meest voorkomende formaat voor gegevensuitwisseling. De json module in de standaardbibliotheek verwerkt het native.

Van Python tot JSON: dumps

json.dumps(object) serialiseert een Python-object naar een JSON-string.

Python
import json

dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'

json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sorted

Van JSON tot Python: loads

json.loads(string) parseert een JSON-tekenreeks en retourneert Python-objecten.

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

Type toewijzing

JSONPython
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

Uit bestand: dump / load

Python
with open("config.json", "w") as f:
    json.dump(dati, f, indent=2)

with open("config.json") as f:
    dati = json.load(f)

Zonder de afsluitende "s" werken ze aan bestanden (bestandsachtig), met de "s" aan strings.

Niet-serialiseerbare typen: default

datetime, set, uw aangepaste klassen zijn standaard niet serialiseerbaar:

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

Je kunt een default functie doorgeven die vertelt hoe je ze moet transformeren:

Python
def converti(obj):
    if isinstance(obj, datetime.datetime):
        return obj.isoformat()
    if isinstance(obj, set):
        return list(obj)
    raise TypeError(f"non serializzabile: {type(obj)}")

json.dumps({"ora": datetime.datetime.now()}, default=converti)

JSON- en bestandsbewerkingen

De standaardbibliotheek biedt ook json.dump() en json.load() (zonder de 's') om JSON-gegevens rechtstreeks van en naar bestanden te schrijven en te lezen, op natuurlijke wijze gecombineerd met contextmanagers:

Python
with open("data.json", "w") as f:
    json.dump(data, f)

Probeer het

Oefening#python.m8.l1.e1
Pogingen: 0Laden…

Gegeven `data = {'nome': 'Ada', 'anni': 36}`, serialiseer het naar JSON met indent=2 en wijs het toe aan de variabele `json_str`. Evalueer `json_str`.

Editor laden…
Toon hint

json.dumps(gegevens, streepje=2)

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#python.m8.l1.e2
Pogingen: 0Laden…

Gegeven de JSON-tekenreeks s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', parseert u deze met json.loads in gegevens en berekent u de som van de 'v'-waarden in totaal. Evalueer het totaal.

Editor laden…
Toon hint

json.loads retourneert een lijst met dictaten.

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#python.m8.l1.e3
Pogingen: 0Laden…

Gegeven de JSON-tekenreeks \`json_data = '{"name": "Alice", "age": 30}'\`, decodeer deze in een Python-woordenboek met behulp van \`json.loads\`. Extraheer de waarde die is gekoppeld aan de sleutel \`'naam'\` en sla deze op in \`gebruikersnaam\`. Evalueer ten slotte \`gebruikersnaam\`.

Editor laden…
Toon hint

Gebruik json.loads(json_data) om te decoderen en open vervolgens via data['name'].

Oplossing beschikbaar na 3 pogingen