PythonでクラスオブジェクトとカスタムオブジェクトをJSONファイルにシリアライズする方法

この記事では、PythonでクラスオブジェクトやカスタムオブジェクトをJSONファイルにシリアライズする方法について解説します。具体的なコード例とその解説、応用例を含めて詳しく説明していきます。

目次

シリアライズとは?

シリアライズとは、オブジェクトの状態をバイトストリームやテキストストリームなどに変換するプロセスです。このプロセスによって、オブジェクトの状態が保存されたり、ネットワーク経由で送信されたりします。

基本的なシリアライズ


import json

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person("Alice", 30)

# オブジェクトをシリアライズ
person_json = json.dumps(person.__dict__)
print(person_json)

# JSONファイルに保存
with open('person.json', 'w') as f:
    json.dump(person.__dict__, f)

この基本的な例では、`Person` クラスのインスタンスをシリアライズしています。`json.dumps()`メソッドでPythonオブジェクトをJSON形式の文字列に変換し、その後にJSONファイルに保存しています。

解説

– `__dict__`: Pythonのオブジェクトは`__dict__`属性を持っていて、そのオブジェクトの属性を辞書形式で取得できます。
– `json.dumps()`: PythonオブジェクトをJSON形式の文字列に変換します。
– `json.dump()`: PythonオブジェクトをJSONファイルに保存します。

カスタムオブジェクトのシリアライズ


# カスタムシリアライザ関数を定義
def person_serializer(person):
    return {"name": person.name, "age": person.age, "type": "Person"}

# カスタムシリアライザを使用してオブジェクトをシリアライズ
person_json = json.dumps(person, default=person_serializer)
print(person_json)

解説

– `default` パラメータ: `json.dumps()`メソッドにカスタムシリアライザ関数を渡すことができます。この関数は、シリアライズできないオブジェクトが出現した際に呼び出されます。

応用例

応用例1: 複数のオブジェクトをシリアライズ


people = [Person("Alice", 30), Person("Bob", 40)]
people_json = json.dumps([p.__dict__ for p in people])
print(people_json)

応用例2: オブジェクトの中にオブジェクト


class Team:
    def __init__(self, name, members):
        self.name = name
        self.members = members

team = Team("Team A", [Person("Alice", 30), Person("Bob", 40)])
team_json = json.dumps(team, default=lambda o: o.__dict__)
print(team_json)

応用例3: クラスメソッドを含むオブジェクト


class AdvancedPerson(Person):
    def greet(self):
        return f"Hello, I'm {self.name}."

# クラスメソッドを無視してシリアライズ
advanced_person = AdvancedPerson("Charlie", 50)
advanced_person_json = json.dumps(advanced_person.__dict__)
print(advanced_person_json)

まとめ

PythonでクラスオブジェクトやカスタムオブジェクトをJSONにシリアライズする方法はいくつかありますが、基本的には`json`モジュールを用いてシンプルに実行できます。カスタムオブジェクトに対しては、`default`パラメータを用いてカスタムシリアライザ関数を設定することが可能です。

コメント

コメントする

目次