Vai al contenuto
eLearner.app
Modulo 8 · Lezione 1 di 429/36 nel corso~10 min
Lezioni del modulo (1/4)

JSON: serialize e parse

JSON è il formato di scambio dati più diffuso. Il modulo json della standard library lo gestisce nativamente.

Da Python a JSON: dumps

json.dumps(oggetto) serializza un oggetto Python in stringa JSON.

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)
# stringa formattata su più righe, chiavi ordinate

Da JSON a Python: loads

json.loads(stringa) parsa una stringa JSON e ritorna oggetti Python.

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

Mappatura dei tipi

JSONPython
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

Da file: 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)

Senza la "s" finale lavorano su file (file-like), con la "s" su stringhe.

Tipi non serializzabili: default

datetime, set, le tue classi custom non sono serializzabili di default:

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

Puoi passare una funzione default che dice come trasformarli:

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 e la gestione dei file

La libreria standard offre json.dump() e json.load() (senza la 's') per scrivere e leggere direttamente da file, integrandosi perfettamente con i context manager. Ad esempio:

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

Prova tu

Esercizio#python.m8.l1.e1
Tentativi: 0Caricamento…

Dato `data = {'nome': 'Ada', 'anni': 36}`, serializza in JSON con indent=2 e assegna alla variabile `json_str`. Valuta `json_str`.

Caricamento editor…
Mostra suggerimento

json.dumps(data, indent=2)

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#python.m8.l1.e2
Tentativi: 0Caricamento…

Data la stringa JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', parsala con json.loads in data e calcola la somma dei valori 'v' in total. Valuta total.

Caricamento editor…
Mostra suggerimento

json.loads ritorna una lista di dict.

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#python.m8.l1.e3
Tentativi: 0Caricamento…

Data la stringa JSON `json_data = '{"name": "Alice", "age": 30}'`, decodificala in un dizionario Python usando `json.loads`. Estrai il valore associato alla chiave `'name'` e salvalo in `user_name`. Valuta infine `user_name`.

Caricamento editor…
Mostra suggerimento

Usa json.loads(json_data) per decodificare, poi accedi tramite data['name'].

Soluzione disponibile dopo 3 tentativi