概要
Pythonのカスタムクラスをjson.dumps()でシリアライズする際、そのままではJSON化できずエラーが発生します。この記事では、カスタムクラスをJSONシリアライズ可能にする方法として、__dict__を利用する方法やカスタムエンコーダを実装する方法を紹介します。
__dict__ を使ったシンプルな方法
クラスオブジェクトの__dict__属性を使うと、オブジェクトの属性を辞書形式で取得できるため、そのままjson.dumps()に渡してシリアライズが可能です。
import json
class FileItem:
def __init__(self, fname):
self.fname = fname
f = FileItem("/foo/bar")
print(json.dumps(f.__dict__))
この方法はシンプルで、基本的なクラスには有効です。
カスタムエンコーダの使用
より柔軟なシリアライズが必要な場合は、JSONEncoderをサブクラス化してカスタムエンコーダを作成できます。defaultメソッドをオーバーライドして、オブジェクトの属性を辞書形式に変換します。
from json import JSONEncoder
class FileItem:
def __init__(self, fname):
self.fname = fname
class MyEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, FileItem):
return obj.__dict__
return super().default(obj)
f = FileItem("/foo/bar")
print(json.dumps(f, cls=MyEncoder))
これにより、json.dumps()でクラスオブジェクトを直接シリアライズできます。
カスタム関数の利用
json.dumps()にはdefault引数として関数を渡すことも可能です。この関数を使って、シリアライズ可能な形式に変換します。
def serialize(obj):
if hasattr(obj, '__dict__'):
return obj.__dict__
raise TypeError(f"Type {type(obj)} not serializable")
f = FileItem("/foo/bar")
print(json.dumps(f, default=serialize))
まとめ
クラスをJSONシリアライズするためには、__dict__を使った簡易的な方法や、カスタムエンコーダを作成する方法があります。用途に応じてこれらの方法を使い分けることで、複雑なクラスも簡単にJSON化することが可能です。