Retour au cours

json : sérialiser/désérialiser des objets

json est le format d’échange standard pour beaucoup d’APIs.

objectifs

  • sérialiser avec json.dumps() / json.dump()
  • désérialiser avec json.loads() / json.load()
  • régler indent, ensure_ascii, sort_keys
  • valider la présence de champs

explication détaillée

  • texte → objet python : json.loads(text) / json.load(f)
  • objet python → texte : json.dumps(obj, indent=2, ensure_ascii=False) / json.dump(obj, f, ...)
  • ensure_ascii=False pour conserver accent/utf‑8
  • attention : set et objets non sérialisables → transformer au préalable

exemples exécutables

import json
obj = {"name": "ana", "skills": ["py", "sql"], "active": True}
text = json.dumps(obj, ensure_ascii=False, indent=2, sort_keys=True)
with open("user.json", "w", encoding="utf-8") as f:
    f.write(text)

with open("user.json", "r", encoding="utf-8") as f:
    data = json.load(f)
print(data["name"])
# validation minimale
required = {"name", "skills"}
missing = required - set(data)
print("manquants:", missing)
# sérialiser un objet non standard
from pathlib import Path
payload = {"files": [str(p) for p in Path(".").glob("*.md")]}
print(json.dumps(payload, ensure_ascii=False, indent=2))

bonnes pratiques

  • conserver ensure_ascii=False et indent=2 pour lecture humaine
  • valider les champs requis avant d’utiliser les données
  • sérialiser des chemins/objets en chaînes/structures natives

pièges courants

  • essayer de dumper un objet non sérialisable → transformer d’abord
  • oublier l’encodage en écriture/lecture
  • supposer qu’un champ existe toujours

exercices

  1. joindre deux fichiers json simples en une seule liste puis sauvegarder.
  2. lire config.json, fusionner avec des overrides en mémoire, écrire effective-config.json.
  3. convertir un CSV simple en JSON liste d’objets.