概要

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