Depuis Python 3.7, il existe quelque chose appelé une classe de données:
from dataclasses import dataclass
@dataclass
class Foo:
x: str
Cependant, les éléments suivants échouent:
>>> import json
>>> foo = Foo(x="bar")
>>> json.dumps(foo)
TypeError: Object of type Foo is not JSON serializable
Comment faire pour que json.dumps()
encode les instances de Foo
dans json objects ?
Tout comme vous pouvez ajouter une prise en charge à l'encodeur JSON pour les objets datetime
ou Decimals, vous pouvez également fournir une sous-classe d'encodeur personnalisée pour sérialiser les classes de données:
import dataclasses, json
class EnhancedJSONEncoder(json.JSONEncoder):
def default(self, o):
if dataclasses.is_dataclass(o):
return dataclasses.asdict(o)
return super().default(o)
json.dumps(foo, cls=EnhancedJSONEncoder)
Ne pouvez-vous pas simplement utiliser la fonction dataclasses.asdict()
pour convertir la classe de données en dict? Quelque chose comme:
>>> @dataclass
... class Foo:
... a: int
... b: int
...
>>> x = Foo(1,2)
>>> json.dumps(dataclasses.asdict(x))
'{"a": 1, "b": 2}'