カスタム エンコーダなしでカスタム オブジェクトを 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 サイトの他の関連記事を参照してください。