【Python】jsonで自作クラスを含んだデータをシリアライズ/デシリアライズする
オブジェクトをファイルに保存したい時、JSON便利ですよね。
パフォーマンスが欲しい時はprotobufやpickleを使いますが、そうでもない時はJSONやxml。
私的にはJSONが一番見やすいので、断然JSONを使います。
今日はJSONで自作クラスを保存したい時の話です。
シリアライズ(保存)
int、float、boolean、None、stringなどの基本型は普通にシリアライズ可能です。
しかし、このように自作クラス(下の例ではNotSettedParameter)を作り、
シリアライズ対象にしたとすると、
のようにエラーが出ます。
このときにはJSONのエンコーダーを自分で作成してNotSettedParameter型の変数をどのようにエンコードするか定義する必要があります。
例えば、NotSettedParameterは'NotSettedParameter'という文字列にエンコードするとします。
そのためには、エンコーダーは
のように定義すればよいです。エンコーダはシリアライズ時にcls引数として設定します。
デシリアライズ(読み込み)
このとき、
とすると、
という結果になります。これは'NotSettedParameter'はそのまま文字列の'NotSettedParameter'に解釈されていることを意味します。
そうではなく、自作クラスのNotSettedParameter()としてデシリアライズしてほしいときは、デコーダーを自分で定義する必要があります。今回の場合、デコーダは、
デシリアライズ時にobject_hook関数として指定します。
参考:
pythonでjson出力する際で対応していない型(e.g. datetime)の値を変換しながら出力したい - Qiita