2.28. JSON¶
JSON (JavaScript Object Notation) è un formato di testo compatto e leggibile dall’uomo per dati strutturati. Definisce sei tipi – string, number, boolean, null, array e object – ciascuno dei quali corrisponde direttamente a un valore Python, quindi convertire tra Python e JSON è una singola chiamata di funzione in entrambe le direzioni.
JSON è la lingua franca dei file di configurazione e delle API web. Ricorri ad esso ogni volta che hai bisogno di salvare su disco un piccolo insieme di impostazioni in una forma leggibile anche a occhio, o di scambiare dati strutturati con un altro programma.
Due funzioni coprono la maggior parte delle esigenze:
json.dumps()– dump string: trasforma un valore Python in una stringa JSON.json.loads()– load string: analizza una stringa JSON riportandola in Python.
La coppia json.dump / json.load (senza s) svolge lo stesso compito ma prende direttamente un oggetto file.
2.28.1. Codifica (dumps)¶
import json
config = {
"name": "OpenMV",
"width": 320,
"tags": ["red", "round"],
}
text = json.dumps(config)
print(text)
Output:
{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}
La corrispondenza è:
Qualsiasi cosa al di fuori di questo insieme (una classe personalizzata, un buffer bytes, un set) solleva TypeError. Converti prima il valore.
Nota
La funzione json.dumps() di CPython accetta un argomento indent per un output formattato in modo leggibile; quella di MicroPython no. L’unica manopola di formattazione è separators, che controlla la spaziatura in linea – passa (',', ':') per la forma più compatta. L’output indentato su più righe deve essere prodotto a mano se necessario.
2.28.2. Decodifica (loads)¶
text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])
Output:
OpenMV 320
Gli oggetti JSON diventano dict, gli array diventano list e il resto torna ai rispettivi equivalenti Python. Un JSON non valido solleva ValueError.
2.28.3. Lettura e scrittura di file¶
La coppia basata su file si integra bene con with:
import json
with open("config.json") as f:
config = json.load(f)
config["width"] = 640
with open("config.json", "w") as f:
json.dump(config, f)
Tratta il file JSON come un record completo – leggilo, modifica il valore Python, riscrivilo. Cercare di modificare JSON sul posto all’interno di un file di solito crea più bug di quanti ne risparmi.