概要
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化することが可能です。