カスタム エンコーダーを実装せずに、Python でカスタム オブジェクトを JSON シリアル化可能にするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-31 10:19:02
オリジナル
347 人が閲覧しました

How can I make custom objects JSON serializable in Python without implementing custom encoders?

カスタム エンコーダを実装せずにカスタム オブジェクトを JSON シリアル化可能にする

Python のデフォルトの JSON シリアル化メカニズムには、json.JSONEncoder のカスタム サブクラスの作成が含まれます。シリアル化不可能なオブジェクトを処理します。このアプローチは広く使用されていますが、呼び出し元のコードを変更せずにクラスを JSON シリアル化可能にしたいユーザーにとっては面倒な場合があります。

この問題に対処するための 1 つの解決策として、Python のモンキー パッチ技術を活用することが考えられます。これには、実行時にソース コードを変更することで既存のモジュールの動作を変更することが含まれます。この場合、json モジュールの JSONEncoder.default() メソッドを変更して、シリアル化されているオブジェクト内の特別な "to_json" メソッドを確認できます。このようなメソッドが存在する場合、それを使用してオブジェクトの JSON 表現を生成できます。

このアプローチを実装するには、次のコードを使用してモジュール (例: make_json_serializable.py) を作成します。

<code class="python">from json import JSONEncoder

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

_default.default = JSONEncoder.default  # Save unmodified default.
JSONEncoder.default = _default # Replace it.</code>
ログイン後にコピー

このコードは、シリアル化されるオブジェクト内の「to_json」メソッドをチェックするように JSONEncoder.default() メソッドを変更します。見つかった場合、メソッドは JSON 表現の生成に使用されます。それ以外の場合は、デフォルトの動作が使用されます。

このモジュールを使用するには、JSON シリアル化操作の前にインポートしてモンキー パッチを適用します。

<code class="python">import make_json_serializable</code>
ログイン後にコピー

これで、 「to_json」メソッドは、カスタム エンコーダを必要とせずに、そのメソッドを使用してシリアル化されます。

ただし、このアプローチでも、ユーザーは、JSON をシリアル化可能にしたいクラスごとにカスタムの「to_json」メソッドを実装する必要があります。より柔軟性を提供する代替ソリューションは、pickle モジュールを使用してオブジェクトを自動的にシリアル化および逆シリアル化することです。

JSONEncoder.default() メソッドにモンキーパッチを適用して非標準の JSON データ型を pickle にすることで、カスタムのシリアル化メソッドが必要です。ただし、逆シリアル化プロセスには、ピクル化されたオブジェクトを処理するためのカスタム object_hook 関数が必要です。

このアプローチは、呼び出し元によるコード変更を必要とせずに、カスタム オブジェクトを JSON シリアル化可能にする、よりクリーンで汎用的な方法を提供します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート