ホームページ  >  記事  >  バックエンド開発  >  Python のデフォルトのエンコーダーを使用してカスタム オブジェクトを JSON シリアル化可能にするにはどうすればよいですか?

Python のデフォルトのエンコーダーを使用してカスタム オブジェクトを JSON シリアル化可能にするにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-31 00:26:03953ブラウズ

How can I make custom objects JSON serializable using the default encoder in Python?

デフォルトのエンコーダーを使用してオブジェクトを JSON シリアル化可能にする

シリアル化できないカスタム オブジェクトを JSON にシリアル化するデフォルトの方法では、json.JSONEncoder をサブクラス化し、カスタム エンコーダーをjson.dumps()。これにより、通常は次のようなコードが生成されます。

<code class="python">class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Foo):
            return obj.to_json()

        return json.JSONEncoder.default(self, obj)

print(json.dumps(obj, cls=CustomEncoder))</code>

しかし、デフォルトのエンコーダを使用してオブジェクトをシリアル化可能にしたい場合はどうすればよいでしょうか?残念ながら、json モジュールが提供する直接的な解決策はありません。

デフォルトのエンコーディングにモンキーパッチを使用する

json モジュールの制限にもかかわらず、と呼ばれる手法を通じて目的の機能を実現することができます。モンキーパッチ。これには、default() メソッドを置き換えることによって json モジュールのデフォルトの動作を変更することが含まれます。

JSONEncoder.default() メソッドを変更するモジュールを作成すると、モジュールが変更されるため、後続のすべての JSON シリアル化操作が影響を受けます。 sys.modules にキャッシュされます。次のスタンドアロン モジュールは、このモンキー パッチの実装方法を示しています。

<code class="python">import json

def _default(self, obj):
    return getattr(obj.__class__, "to_json", _default.default)(obj)

_default.default = JSONEncoder.default
JSONEncoder.default = _default</code>

このモンキー パッチ付きモジュールを利用するには、単にインポートするだけで、変更が json モジュールに自動的に適用されます。

オブジェクトのシリアル化のための特別なメソッドの追加

カスタム クラスの自動 JSON シリアル化を有効にするには、カスタム クラス内に __json__ という特別なメソッドを定義できます。 JSONEncoder はこのメソッドをチェックし、その戻り値をシリアル化に使用します。これにより、明示的な to_json() メソッドの必要がなくなります。

Pickle を使用した Python オブジェクトのシリアル化

自動シリアル化のもう 1 つのアプローチは、モンキー パッチを適用した JSONEncoder と組み合わせて pickle モジュールを使用することです。標準の JSON 型ではない Python オブジェクトを pickle にするために、default() メソッドをオーバーライドすることで、特別なクラス メソッドを必要とせずにシリアル化を実現できます。

pickle による逆シリアル化

元の Python を再構築するにはpickle ベースのシリアル化によって生成された JSON 表現からオブジェクトを取得する場合、逆シリアル化中にカスタム object_hook 関数を提供できます。この関数は、シリアル化中に追加された '_python_object' キーを検出し、pickle.loads() を使用して元のオブジェクトを再構築するために使用できます。

結論

json モジュールは直接デフォルトのエンコーダーでオブジェクトを JSON シリアル化可能にする方法は、モンキーパッチまたは pickle モジュールを使用してこれを実現できます。 pickle アプローチでは、ほとんどの Python オブジェクトの自動シリアル化が可能になり、より一般化されたソリューションになります。

以上がPython のデフォルトのエンコーダーを使用してカスタム オブジェクトを JSON シリアル化可能にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。