python のクラスを JSON 化

Page content

コレ を作るにあたって、データの serialize/deserialize の方法を調べた結果、 marshmallow_dataclass に落ち着きました。

いくつか調べた中で、パッと見、直感的に出来そうだった、というだけの理由ですが。。

実際、面倒な処理はほとんど無く、 serialize/deserialize が可能になりました。

使い型

marshmallow_dataclass は、 クラスを宣言する際に @dataclass デコレータを付けて宣言し、 メンバの型を宣言するのが基本です。

こんな感じ。

@dataclass
class LogItem:
    # ゲームタイトル
    title:str
    # 日付
    date:int
    # テキスト
    text:str
    # テキスト長
    len:int

メンバの宣言が python っぽくないと思う方もいるかもしれませんが、 静的型付け言語になれていると、こっちの方が馴染み易い気がします。

JSON 化する場合は、 次のようにクラスメソッドに JSON 化するクラスのインスタンスを渡すだけです。

item = LogItem( "title", time.time(), "text", len( "text" ) )
print( marshmallow_dataclass.class_schema( LogItem )().dumps( item ) )

逆に JSON からクラスインスタンスを生成するには、 次のようにクラスメソッドに渡すだけです。

marshmallow_dataclass.class_schema( LogItem )().loads( text )

とても簡単です。

ただ、躓いた点があったので、気をつけるべき点として書いておきます。

  • python3.7 以降を使用する
  • @dataclass デコレータを付けたクラスに次を宣言してはならない

    • コンストラクタ init
    • @staticmethod load()