2.1 Modulo json
JSON (JavaScript Object Notation) è un formato leggero per lo scambio di dati che è facilmente leggibile e scrivibile da esseri umani e anche facilmente analizzabile e generabile da computer. JSON è spesso usato per trasmettere dati tra un server e un'applicazione web, così come per memorizzare configurazioni e impostazioni.
Il modulo json
in Python offre funzioni per la serializzazione (conversione di oggetti Python in stringhe JSON) e deserializzazione (conversione di stringhe JSON in oggetti Python). Questo modulo è incluso nella libreria standard di Python ed è ampiamente utilizzato per lavorare con dati JSON.
Le funzioni principali del modulo json
ricordano molto quelle di pickle
e operano in modo simile. Cosa vuoi — è uno standard!
-
Lavorare con stringhe:
-
json.dumps(obj)
— Converte un oggetto Python in una stringa JSON. -
json.loads(s)
— Converte una stringa JSON in un oggetto Python.
-
-
Lavorare con file:
-
json.dump(obj, file)
— Serializza un oggetto Python e lo scrive in un file di testo. -
json.load(file)
— Deserializza un oggetto Python da un file di testo contenente dati nel formato JSON.
-
Facciamo qualche esempio per capire meglio come funzionano queste funzioni.
2.2 Serializzazione in stringa
Serializzazione di oggetti Python in stringhe JSON
Per serializzare un oggetto in una stringa, basta passarlo alla funzione json.dumps()
.
import json
# Esempio di oggetto da serializzare
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
# Conversione di un oggetto Python in una stringa JSON
json_string = json.dumps(data, indent=4)
print("Dati serializzati (JSON):", json_string)
Deserializzazione di stringhe JSON in oggetti Python
Per ottenere un oggetto da una stringa, basta passare la stringa JSON contenente la descrizione dell'oggetto al metodo json.loads()
.
import json
# Esempio di stringa JSON per deserializzazione
json_string = '''
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
'''
# Conversione di una stringa JSON in un oggetto Python
data = json.loads(json_string)
print("Dati deserializzati (Python):", data)
2.3 Serializzazione in file
Scrittura di oggetti Python in file nel formato JSON
Per scrivere un oggetto in un file, devi chiamare il metodo json.dump()
. Quando lavori con file, è importante gestire le eccezioni per trattare correttamente eventuali errori. Ecco un esempio:
import json
# Esempio di oggetto da serializzare
data = {
"name": "Bob",
"age": 25,
"is_student": True,
"courses": ["History", "Literature"],
"address": {
"city": "Los Angeles",
"zip_code": "90001"
}
}
# Scrittura di un oggetto Python in un file JSON con gestione delle eccezioni
try:
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
print("Dati scritti con successo nel file.")
except IOError:
print("Errore durante la scrittura nel file.")
except json.JSONEncodeError:
print("Errore nella codifica JSON.")
Lettura di oggetti Python da file nel formato JSON
La lettura è altrettanto semplice — basta passare il file al metodo json.load()
. Anche qui, è importante gestire le eccezioni:
import json
# Lettura di un oggetto Python da un file JSON con gestione delle eccezioni
try:
with open('data.json', 'r') as file:
data = json.load(file)
print("Dati deserializzati dal file (Python):", data)
except IOError:
print("Errore durante la lettura del file.")
except json.JSONDecodeError:
print("Errore nella decodifica JSON.")
2.4 Parametri aggiuntivi delle funzioni
Alla funzione che gestisce la serializzazione, possiamo passare parametri aggiuntivi che rendono il tuo JSON più bello:
-
skipkeys
: SeTrue
, salta le chiavi che non sono stringhe, numeri oNone
. -
ensure_ascii
: SeTrue
, tutti i caratteri non ASCII verranno eseguiti usando Unicode escape sequences. -
indent
: Se è specificato un numero, verranno aggiunti spazi per migliorare la leggibilità. -
sort_keys
: SeTrue
, le chiavi nel JSON verranno ordinate in ordine alfabetico.
Ecco un esempio di utilizzo dei parametri di json.dumps()
:
import json
data = {"c": 3, "b": 2, "a": 1}
# Serializzazione con chiavi ordinate e spaziatura
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
2.5 Decoder e encoder personalizzati
Il modulo json
permette di usare funzioni personalizzate per la serializzazione e deserializzazione degli oggetti.
Esempio di encoder personalizzato
Iniziamo creando una classe encoder speciale che controlla all'interno che se il tipo di oggetto è datetime, restituisce l'oggetto come stringa nel formato ISO
.
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {
"name": "Alice",
"timestamp": datetime.now()
}
# Serializzazione con encoder personalizzato
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)
Esempio di decoder personalizzato
Per l'operazione inversa ci serve una funzione che converta la stringa in una data. Ad esempio, possiamo semplicemente controllare il nome del campo, e se si chiama timestamp, convertiamo la stringa in un oggetto datetime
:
import json
from datetime import datetime
def custom_decoder(dct):
if 'timestamp' in dct:
dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
return dct
json_string = '''
{
"name": "Alice",
"timestamp": "2023-05-15T14:30:00"
}
'''
# Deserializzazione con decoder personalizzato
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
GO TO FULL VERSION