1. ホーム
  2. python

[解決済み] クラスをJSONシリアライザブルにする方法

2022-03-18 03:55:09

質問

Pythonのクラスをシリアライズ可能にするには?

簡単なクラスです。

class FileItem:
    def __init__(self, fname):
        self.fname = fname

を出力できるようにするには、どうしたらいいのでしょうか?

>>> import json

>>> my_file = FileItem('/foo/bar')
>>> json.dumps(my_file)
TypeError: Object of type 'FileItem' is not JSON serializable

エラーなし

解決方法は?

期待される出力についてイメージはありますか?例えば、こんな感じでしょうか?

>>> f  = FileItem("/foo/bar")
>>> magic(f)
'{"fname": "/foo/bar"}'

その場合、単に json.dumps(f.__dict__) .

よりカスタマイズされた出力が必要な場合は、サブクラスの JSONEncoder を作成し、独自のシリアライズを実装します。

簡単な例として、以下をご覧ください。

>>> from json import JSONEncoder
>>> class MyEncoder(JSONEncoder):
        def default(self, o):
            return o.__dict__    

>>> MyEncoder().encode(f)
'{"fname": "/foo/bar"}'

そして、このクラスを json.dumps() メソッドを cls kwargです。

json.dumps(cls=MyEncoder)

デコードも行いたい場合は、カスタムの object_hook JSONDecoder クラスがあります。例えば

>>> def from_json(json_object):
        if 'fname' in json_object:
            return FileItem(json_object['fname'])
>>> f = JSONDecoder(object_hook = from_json).decode('{"fname": "/foo/bar"}')
>>> f
<__main__.FileItem object at 0x9337fac>
>>>