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.
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 sortedVan JSON tot Python: loads
json.loads(string) parseert een JSON-tekenreeks en retourneert Python-objecten.
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"] # 'Ada'
type(d) # <class 'dict'>Type toewijzing
| JSON | Python |
|---|---|
object | dict |
array | list |
string | str |
number | int / float |
true | True |
false | False |
null | None |
Uit bestand: dump / load
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:
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializableJe kunt een default functie doorgeven die vertelt hoe je ze moet transformeren:
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:
with open("data.json", "w") as f:
json.dump(data, f)Probeer het
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`.
Toon hint
json.dumps(gegevens, streepje=2)
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
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.
Toon hint
json.loads retourneert een lijst met dictaten.
Oplossing beschikbaar na 3 pogingen
Extra uitdaging
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\`.
Toon hint
Gebruik json.loads(json_data) om te decoderen en open vervolgens via data['name'].
Oplossing beschikbaar na 3 pogingen