Nell'ultimo decennio, si è affermato sempre di più JSON (acronimo che sta per JavaScript Object Notation), formato di file di testo usato per la strutturazione dei dati, e basato sulla sintassi per la definizione degli oggetti su Javascript.
Il formato JSON è spesso usato per lo scambio di dati tra moduli di applicazioni web, nonché per la gestione di file di configurazione o, più semplicemente, per archiviare dati in formato testuale. Data la grande diffusione di questo formato, è bene capire come leggere e manipolare dati di questo tipo anche tramite Python. In questa lezione ci occuperemo proprio di questo, supponendo che il lettore conosca già questo formato di dati; se così non fosse, rimandiamo ad un apposito approfondimento di HTML.it su questo specifico argomento.
Lettura di file JSON
Trattandosi di un formato basato su file di testo, teoricamente potremmo accedere e leggere qualunqe file JSON tramite la funzione open
, che abbiamo già trattato discutendo della gestione dei file. Nelle ultime versioni di Python, però, è incluso tra gli altri un modulo specifico per l'interfacciamento con i file in formato JSON: il modulo json, appunto.
La lettura di un file JSON avviene sempre tramite open
, ma il risultato di questa operazione viene poi passato ad un'altra funzione, load
, proprio del modulo json. Vediamo un semplice esempio qui di seguito:
import json
data = json.load(open("dati.json"))
La funzione load
non fa altro che leggere automaticamente il contenuto del file, trasformandolo in una rappresentazione molto più "vicina" a Python: quella dei dizionari. Supponiamo, ad esempio, di avere a disposizione un file dati.json, contenente il testo seguente:
{
"mappe": [
{
"id": "01",
"nome": "test"
},
{
"id": "02",
"nome": "prova"
}
],
"dispositivo": {
"power": "on",
"parametri": {
"p1": "0.0235849594",
"p2": "0.4877774151",
"p3": "2.0000022549"
}
}
}
L'intero oggetto JSON sarà trasformato in un dizionario con 2 proprietà, mappe e dispositivo, entrambe accessibili tramite la sintassi basata sulle parentesi quadre. Discorso analogo si applica agli array JSON (ad esempio quello identificato dalla parola mappe), che sono trasformati in liste. Di seguito vediamo alcuni esempi pratici e chiarificatori:
import json
data = json.load(open("dati.json"))
data["mappe"] #ritorna una lista contenente due dizionari
data["mappe"][0]["id"] #ritorna la stringa "01"
data["dispositivo"]["parametri"] #ritorna un dizionario contenente le chiavi p1, p2 e p3
Scrittura di file JSON
Anche per la scrittura di un file JSON è preferibile ricorrere alle funzionalità di comodo implementate nel modulo json, piuttosto che lavorare a basso livello con la scrittura dei file tradizionali.
Come già accennato poc'anzi, un oggetto JSON può essere facilmente rappresentato da un dizionario in Python. Per questo motivo, per scrivere un file JSON è necessario innanzitutto organizzare i dati all'interno di un dizionario, seguendo la struttura dell'output JSON desiderato. Una volta ottenuto questo dizionario, che supponiamo per il momento memorizzato in una variabile data, è sufficiente utilizzare la funzione dump
:
import json
data = { ... }
with open("output.json", "w") as outfile:
json.dump(data, outfile)
Anche in questo caso, quindi, il procedimento è molto semplice e lineare. Per semplicità, vediamo un esempio concreto. Supponiamo di volere scrivere su un file output.json il JSON d'esempio visto in precedenza. Ecco come potremmo organizzare il nostro codice al fine di creare l'oggetto data dell'esempio precedente:
data = {'mappe': [{'id': '01', 'nome': 'test'},
{'id': '02', 'nome': 'prova'}],
'dispositivo': {'power': 'on',
'parametri': {'p1': '0.0235849594',
'p2': '0.4877774151',
'p3': '2.0000022549'}}}
Si noti che, così facendo, non abbiamo specificato nessuna informazione relativa all'indentazione da utilizzare nel file generato come output. Possiamo aggiungere questa ulteriore possibilità sfruttando il parametro opzionale indent
, che specifica il numero di spazi di usare per l'indentazione:
with open("output.json", "w") as outfile:
json.dump(data, outfile, indent=4) #indentazione con 4 spazi
Per ulteriori dettagli, si consiglia di consultare la documentazione ufficiale relativa al modulo json.