Leçons du module (1/4)
JSON : sérialisation et parsing
JSON est le format d'échange de données le plus répandu. Le module json de la bibliothèque standard le gère nativement.
De Python à JSON : dumps
json.dumps(object) sérialise un objet Python en une chaîne JSON.
import json
dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'
json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sortedDe JSON à Python : loads
json.loads(string) analyse une chaîne JSON et renvoie des objets Python.
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"] # 'Ada'
type(d) # <class 'dict'>Correspondance des types (mapping)
| JSON | Python |
|---|---|
object | dict |
array | list |
string | str |
number | int / float |
true | True |
false | False |
null | None |
Depuis un fichier : dump / load
with open("config.json", "w") as f:
json.dump(dati, f, indent=2)
with open("config.json") as f:
dati = json.load(f)Sans le « s » final, ils fonctionnent sur des fichiers (file-like) ; avec le « s », sur des chaînes de caractères.
Types non sérialisables : default
datetime, set, vos classes personnalisées ne sont pas sérialisables par défaut :
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializableVous pouvez passer une fonction default qui explique comment les transformer :
def converti(obj):
if isinstance(obj, datetime.datetime):
return obj.isoformat()
if isinstance(obj, set):
return list(obj)
raise TypeError(f"non serializzabile: {type(obj)}")
json.dumps({"ora": datetime.datetime.now()}, default=converti)JSON et opérations sur les fichiers
La bibliothèque standard fournit également json.dump() et json.load() (sans le 's') pour écrire et lire des données JSON directement dans et depuis des fichiers, s'associant naturellement avec les gestionnaires de contexte :
with open("data.json", "w") as f:
json.dump(data, f)À vous de jouer
Étant donné `data = {'nome': 'Ada', 'anni': 36}`, sérialisez-le en JSON avec indent=2 et assignez-le à la variable `json_str`. Évaluez `json_str`.
Afficher l'indice
json.dumps(data, indent=2)
Solution disponible après 3 tentatives
Exercice de révision
Étant donné la chaîne JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', analysez-la avec json.loads dans data et calculez la somme des valeurs 'v' dans total. Évaluez total.
Afficher l'indice
json.loads renvoie une liste de dictionnaires.
Solution disponible après 3 tentatives
Défi supplémentaire
Étant donné la chaîne JSON `json_data = '{"name": "Alice", "age": 30}'`, décodez-la en un dictionnaire Python à l'aide de `json.loads`. Extrayez la valeur associée à la clé `'name'` et stockez-la dans `user_name`. Enfin, évaluez `user_name`.
Afficher l'indice
Utilisez json.loads(json_data) pour décoder, puis accédez via data['name'].
Solution disponible après 3 tentatives