Formati dati 3 - JSON
Scarica zip esercizi
Il JSON è un formato più elaborato, molto diffuso nel mondo delle applicazioni web.
Un file con estensione .json
è semplicemente un file di testo, strutturato ad albero. Vediamone un esempio, tratto dal dataset stazioni di Bike sharing di Lavis:
Fonte dati: dati.trentino.it - Servizio Trasporti Provincia Autonoma di Trento
Licenza: CC-BY 4.0
File bike-sharing-lavis.json:
[
{
"name": "Grazioli",
"address": "Piazza Grazioli - Lavis",
"id": "Grazioli - Lavis",
"bikes": 3,
"slots": 7,
"totalSlots": 10,
"position": [
46.139732902099794,
11.111516155225331
]
},
{
"name": "Pressano",
"address": "Piazza della Croce - Pressano",
"id": "Pressano - Lavis",
"bikes": 2,
"slots": 5,
"totalSlots": 7,
"position": [
46.15368174037716,
11.106601229430453
]
},
{
"name": "Stazione RFI",
"address": "Via Stazione - Lavis",
"id": "Stazione RFI - Lavis",
"bikes": 4,
"slots": 6,
"totalSlots": 10,
"position": [
46.148180371138814,
11.096753997622727
]
}
]
Come si può notare, il formato del JSON è molto simile a strutture dati che già abbiamo in Python, come stringhe, numeri interi, float, liste e dizionari. L’unica differenza sono i campi null
del JSON che diventano None
in Python. Quindi la conversione a Python è quasi sempre facile e indolore, per farla basta usare il modulo già pronto json
con la funzione json.load
, che interpreta il testo dal file json e lo converte in strutture dati Python:
[1]:
import json
with open('bike-sharing-lavis.json', encoding='utf-8') as f:
contenuto_python = json.load(f)
print(contenuto_python)
[{'name': 'Grazioli', 'address': 'Piazza Grazioli - Lavis', 'id': 'Grazioli - Lavis', 'bikes': 3, 'slots': 7, 'totalSlots': 10, 'position': [46.139732902099794, 11.111516155225331]}, {'name': 'Pressano', 'address': 'Piazza della Croce - Pressano', 'id': 'Pressano - Lavis', 'bikes': 2, 'slots': 5, 'totalSlots': 7, 'position': [46.15368174037716, 11.106601229430453]}, {'name': 'Stazione RFI', 'address': 'Via Stazione - Lavis', 'id': 'Stazione RFI - Lavis', 'bikes': 4, 'slots': 6, 'totalSlots': 10, 'position': [46.148180371138814, 11.096753997622727]}]
Notiamo che quanto letto con la funzione json.load
non è più semplice testo ma oggetti Python. Per questo json, l’oggetto più esterno è una lista (nota le quadre all’inizio e alla fine del file), e usando type
su contenuto_python
ne abbiamo la conferma:
[2]:
type(contenuto_python)
[2]:
list
Guardando meglio il JSON, vedrai che è una lista di dizionari. Quindi, per accedere al primo dizionario (cioè quello all’indice zeresimo), possiamo scrivere
[3]:
contenuto_python[0]
[3]:
{'name': 'Grazioli',
'address': 'Piazza Grazioli - Lavis',
'id': 'Grazioli - Lavis',
'bikes': 3,
'slots': 7,
'totalSlots': 10,
'position': [46.139732902099794, 11.111516155225331]}
Vediamo che è la stazione in Piazza Grazioli. Per accedere al nome esatto, accederemo alla chiave 'address'
del primo dizionario :
[4]:
contenuto_python[0]['address']
[4]:
'Piazza Grazioli - Lavis'
Per accedere alla posizione, usiamo la chiave corrispondente:
[5]:
contenuto_python[0]['position']
[5]:
[46.139732902099794, 11.111516155225331]
Notiamo come essa sia a sua volta una lista. In JSON, possiamo avere alberi ramificati arbitrariamente, senza necessariamente una struttura regolare (per quanto quando generiamo noi un json sia sempre auspicabile mantenere uno schema regolare nei dati).
JSONL
C’è un particolare tipo di file JSON che si chiama JSONL (nota ‘L’ alla fine), e cioè un file di testo contenente una sequenza di linee, ciascuna rappresentante un valido oggetto json.
Guardiamo per esempio il file impiegati.jsonl:
{"nome": "Mario", "cognome":"Rossi"}
{"nome": "Paolo", "cognome":"Bianchi"}
{"nome": "Luca", "cognome":"Verdi"}
Per leggerlo, possiamo aprire il file, separarlo nelle linee di testo e poi interpretare ciascuna come singolo oggetto JSON
[6]:
import json
with open('./impiegati.jsonl', encoding='utf-8',) as f:
lista_testi_json = list(f) # converte le linee del file di testo in una lista Python
# in questo caso avremo un contenuto python per ciascuna riga del file originale
i = 0
for testo_json in lista_testi_json:
contenuto_python = json.loads(testo_json) # converte testo json in oggetto python
print('Oggetto ', i)
print(contenuto_python)
i = i + 1
Oggetto 0
{'nome': 'Mario', 'cognome': 'Rossi'}
Oggetto 1
{'nome': 'Paolo', 'cognome': 'Bianchi'}
Oggetto 2
{'nome': 'Luca', 'cognome': 'Verdi'}
ATTENZIONE: questa foglio è IN-PROGRESS
Prosegui
Continua con le challenge
[ ]: