ホームページ  >  記事  >  バックエンド開発  >  カスタム エンコーダーを使用せずにカスタム オブジェクトを JSON シリアル化可能にする方法

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 03:21:40226ブラウズ

How to Make Custom Objects JSON Serializable without Custom Encoders?

カスタム エンコーダなしでカスタム オブジェクトを JSON シリアル化可能にする

シリアル化不可能なオブジェクトのカスタム JSON シリアル化には、通常、json.JSONEncoder の拡張とカスタム エンコーダの追加が含まれます。エンコーダを json.dumps() に変換します。ただし、デフォルトのエンコーダを使用してオブジェクトをシリアル化可能にし、簡単なカスタム エンコーダの必要性を排除することは可能です。

デフォルトのエンコーダへのモンキー パッチ

デフォルトのエンコーダは次のようにすることができます。 to_json() などのオブジェクト内の特別なメソッドをチェックし、それをシリアル化に使用するように変更 (モンキーパッチ適用) されました。これは、パッケージの初期化時にインポートされたモジュールで JSONEncoder.default() を再定義することで実行できます。

Pickle を使用した自動シリアル化

より包括的なソリューションには、pickle モジュールの使用が含まれます標準の JSON データ型ではないオブジェクトをピクルします。このアプローチにより、特別なメソッドを必要とせずに、ユーザー定義のクラス インスタンスを含むほとんどの Python オブジェクトを自動的にシリアル化できます。

逆シリアル化

ピクルされたオブジェクトを逆シリアル化するには、カスタム object_hook json.loads() に関数を提供できます。この関数は、_python_object キーを使用してオブジェクトをアンピクルし、元の Python 状態に戻します。

Python 3 の移植性

Python 3 では、json.dumps() はバイト オブジェクトを返します。 、pickle のシリアル化のために変更が必要です。 pickle.dumps() の結果は latin1 でデコードし、pickle.loads() を使用する前に latin1 にエンコードし直すことができます。

make_json_serializable2 というモジュールを考えてみましょう。モンキーパッチとピクルベースの自動シリアル化を実装します:

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

def _default(self, obj):
    return {'_python_object': pickle.dumps(obj).decode('latin1')}

JSONEncoder.default = _default  # Replace the default method.</code>

このモジュールを使用するには、単にインポートするだけで、シリアル化が自動的に適用されます:

<code class="python">import make_json_serializable2

# Custom class 'Foo' is now implicitly JSON serializable
class Foo:
    def __init__(self, name):
        self.name = name

# Serialize and deserialize using the default JSON encoder
data = [Foo('Bar')]
json_string = json.dumps(data)
data2 = json.loads(json_string)
print(data2 == data)  # True</code>

このアプローチ手動のカスタム エンコーダを必要とせずに、カスタム オブジェクトを JSON シリアル化可能にするための簡単で一般化された方法を提供します。

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

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