Exercice 92 / 100

JSON en Python

ConsigneCrée un dictionnaire de 2 utilisateurs (Alice, 25 ans, scores [85,90,78] et Bob, 30 ans, scores [92,88,95]), sérialise en JSON et désérialise

📖 Cours

Rappel json (lib standard json). Sert à sérialiser des structures Python en texte pour les stocker ou les transmettre.

Correspondance json ↔ Python :

object { } ↔ dictarray [ ] ↔ liststring ↔ strnumber ↔ int / floattrue/false ↔ True / Falsenull ↔ None
JSON et Python ne nomment pas les mêmes choses de la même façon : un objet devient un dict, un tableau une liste, true devient True et null devient None
JSON et Python ne nomment pas les mêmes choses de la même façon : un objet devient un dict, un tableau une liste, true devient True et null devient None

Les 4 fonctions clés

json.loads(s) parse une str JSON → objet Pythonjson.load(f) parse un fichier ouvertjson.dumps(obj) sérialise un objet → str JSONjson.dump(obj, f) écrit dans un fichier

Mnémo : le 's' à la fin = string.

Exemple : structure imbriquée

import json
data = { 'utilisateurs': [ {'nom': 'Alice', 'age': 25, 'scores': [85, 90, 78]}, {'nom': 'Bob', 'age': 30, 'scores': [92, 88, 95]} ]}
json_str = json.dumps(data, ensure_ascii=False, indent=2)print(json_str)

Paramètres utiles de dumps :

indent=2 joliment formatéensure_ascii=False garde les accents (sinon \u00e9 etc.)sort_keys=True trie les clés

De la str retour vers Python

parsed = json.loads(json_str)for user in parsed['utilisateurs']: avg = sum(user['scores']) / len(user['scores']) print(f"{user['nom']}: moyenne = {avg:.1f}")

Lire / écrire un fichier .json

# Écrirewith open('out.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2)
# Lirewith open('out.json', 'r', encoding='utf-8') as f: data = json.load(f)

Gérer les types non sérialisables

json ne sait pas sérialiser : datetime, set, numpy arrays...

json.dumps(set([1,2,3])) ❌ TypeErrorjson.dumps(list(set([1,2,3]))) ✅json.dumps(date, default=str) ✅ convertit en str via str(date)

Pour de la doc api ou de la config, json est un standard universel. Pour des types Python plus riches (datetime, custom), pickle est plus puissant mais non portable (Python-only, et risque de sécurité si tu charges du pickle d'origine inconnue).

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →