web-dev-qa-db-ja.com

Python jsonエンコーダーがPythonの新しいデータクラスをサポートするようにします

Python 3.7から始まり、データクラスと呼ばれるものがあります。

_from dataclasses import dataclass

@dataclass
class Foo:
    x: str
_

ただし、次は失敗します。

_>>> import json
>>> foo = Foo(x="bar")
>>> json.dumps(foo)
TypeError: Object of type Foo is not JSON serializable
_

json.dumps()Fooのインスタンスをjsonにエンコードするにはどうすればよいですか? objects

18
miracle2k

datetimeオブジェクト またはDecimalsのJSONエンコーダーにサポートを追加できるように、データクラスをシリアル化するカスタムエンコーダーサブクラスを提供することもできます。

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

dataclasses.asdict()関数を使用して、データクラスを辞書に変換することはできませんか?何かのようなもの:

>>> @dataclass
... class Foo:
...     a: int
...     b: int
...     
>>> x = Foo(1,2)
>>> json.dumps(dataclasses.asdict(x))
'{"a": 1, "b": 2}'
7
Chuck Wooters