web-dev-qa-db-fra.com

Faire en sorte que l'encodeur Jyth Python prenne en charge les nouvelles classes de données Python

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 ?

7
miracle2k

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)
13
miracle2k

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}'
1
Chuck Wooters