Formati dati 3 - JSON

Scarica zip esercizi

Naviga file online

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:

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

Mostra soluzione
[7]:
# scrivi qui


Prosegui

Continua con le challenge