CodeGym /Corso Java /Python SELF IT /Lavorare con JSON tramite json

Lavorare con JSON tramite json

Python SELF IT
Livello 23 , Lezione 1
Disponibile

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: Se True, salta le chiavi che non sono stringhe, numeri o None.
  • ensure_ascii: Se True, 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: Se True, 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)
    
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION