カスタム メソッドによるデフォルトのシリアル化制限の克服
デフォルトの JSON シリアル化では、多くの場合、組み込みの JSONEncoder を使用するのが最も便利な方法です。ただし、シリアル化可能な型から継承しないカスタム オブジェクトの場合、それは困難になる可能性があります。
デフォルト エンコーダへのモンキー パッチ適用
JSONEncoder をサブクラス化する代わりに、次のことができます。モンキーパッチを使用してデフォルトのデフォルトメソッドを変更することで、その動作を変更します。これにより、オブジェクト内の to_json メソッドをチェックし、利用可能な場合はそれをエンコードに使用する特別なロジックを追加できます。
例: シリアル化に特別なメソッドを使用する
<code class="python">import json # Module for monkey-patching def _default(self, obj): return getattr(obj.__class__, "to_json", _default.default)(obj) _default.default = JSONEncoder.default JSONEncoder.default = _default class Foo: def __init__(self, name): self.name = name def to_json(self): return '{"name": "%s"}' % self.name foo = Foo('sazpaz') json_str = json.dumps(foo)</code>
このアプローチにより、カスタム エンコーダーを実装せずにカスタム オブジェクトをシリアル化できます。
Pickle によるシリアル化の自動化
さらに柔軟性を高めるために、pickle モジュールを使用できます。モンキーパッチと組み合わせて。非標準の JSON 型をピクルするカスタムのデフォルト メソッドを作成することで、それらを自動的にシリアル化できます。
<code class="python"># Module for pickle-based serialization from json import JSONEncoder import pickle def _default(self, obj): return {'_python_object': pickle.dumps(obj)} JSONEncoder.default = _default</code>
これにより、複雑なデータ構造を含むユーザー定義のクラスをシリアル化できます。
注: 逆シリアル化の場合、pickle データから Python オブジェクトを再構築するためのカスタム object_hook を提供できます。
以上がカスタム メソッドを使用してデフォルトの JSON シリアル化制限を克服するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。