Exercices Architecture & Patterns JSONEncoder personnalise
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

JSONEncoder personnalise

Par défaut, json.dumps() sait serialiser les types de base Python (dict, list, str, int, float, bool, None). Mais si tu lui passes un objet custom, il leve une TypeError.

Pour gerer ca, tu peux créer un JSONEncoder personnalise en heritant de json.JSONEncoder et en surchargeant la méthode default(self, obj).

Cette méthode est appelee pour chaque objet que le serialiseur ne sait pas gerer. Tu dois retourner un type serialisable (dict, list, str...). Pour les types que tu ne geres pas non plus, tu delegues au parent avec super().default(obj).

Exemple :
import json

class MonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, set):
return list(obj)
return super().default(obj)

json.dumps({1, 2, 3}, cls=MonEncoder) # '[1, 2, 3]'

Crée une classe Produit avec nom (str), prix (float) et en_stock (bool). Crée un ProduitEncoder qui serialise les objets Produit en dictionnaire.

Exemple :
p = Produit('Livre Python', 29.99, True)
json.dumps(p, cls=ProduitEncoder)
# '{"nom": "Livre Python", "prix": 29.99, "en_stock": true}'

Tests (2/4)

Serialise Produit
import json
p = Produit('Livre', 29.99, True)
d = json.loads(json.dumps(p, cls=ProduitEncoder))
assert d['nom'] == 'Livre'
Prix et stock
import json
p = Produit('Cle USB', 9.99, False)
d = json.loads(json.dumps(p, cls=ProduitEncoder))
assert d['prix'] == 9.99 and d['en_stock'] == False

+ 0 tests cachés

Indices (3 disponibles)

solution.py