Python3でclassのjson化

Scalaでcase classを多用していたので、pythonに該当機能がなかったため大変不便でした。

しかし、Python3.7から@dataclass宣言が導入され頻繁に使用しています。

classの先頭に@dataclass宣言をするだけで、Dataclassが保有する様々な機能を使用可能になります。
https://docs.python.org/3/library/dataclasses.html

from dataclasses import dataclass

@dataclass(frozen=True)
class SampleDataclass:
    name: str

このdataclassをjson化できたらいいのに…ずっと思ってました。

いいものがありました。

それがdataclasses-jsonです。
https://pypi.org/project/dataclasses-json/

上記のdataclassの宣言に@dataclass_json 宣言をすることで、簡単にdatacalssからjsonのデコーダ/エンコーダを作成できます!!

from dataclasses import dataclass
from dataclasses_json import dataclass_json

@dataclass_json
@dataclass(frozen=True)
class SampleDataclass:
    name: str

sd = SampleDataclass("hoge")
sd.to_json() # '{"name": "hoge"}'
SampleDataclass.from_json('{"name": "hoge"}') #SampleDataclass(name='hoge')

便利ですねー

これは普通のclass定義で使えるのかな?
=> 使えませんでした。classで使用するとTypeError(‘must be called with a dataclass type or instance’)で怒られます。