Passer au contenu principal
eLearner.app
Module 8 · Leçon 1 sur 429/36 dans le cours~10 min
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.

Python
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 sorted

De JSON à Python : loads

json.loads(string) analyse une chaîne JSON et renvoie des objets Python.

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

Correspondance des types (mapping)

JSONPython
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

Depuis un fichier : dump / load

Python
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 :

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

Vous pouvez passer une fonction default qui explique comment les transformer :

Python
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 :

Python
with open("data.json", "w") as f:
    json.dump(data, f)

À vous de jouer

Exercice#python.m8.l1.e1
Tentatives : 0Chargement…

É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`.

Chargement de l'éditeur…
Afficher l'indice

json.dumps(data, indent=2)

Solution disponible après 3 tentatives

Exercice de révision

Exercice#python.m8.l1.e2
Tentatives : 0Chargement…

É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.

Chargement de l'éditeur…
Afficher l'indice

json.loads renvoie une liste de dictionnaires.

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#python.m8.l1.e3
Tentatives : 0Chargement…

É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`.

Chargement de l'éditeur…
Afficher l'indice

Utilisez json.loads(json_data) pour décoder, puis accédez via data['name'].

Solution disponible après 3 tentatives