在沒有自訂編碼器的情況下使自訂物件JSON 可序列化
不可序列化物件的自訂JSON 序列化通常涉及擴展json.JSONEncoder 並添加自訂編碼器到json.dumps()。但是,可以使用預設編碼器使物件可序列化,從而無需使用簡單的自訂編碼器。
猴子修補預設編碼器
預設編碼器可以是修改(猴子修補)以檢查物件中的特殊方法,例如to_json(),並將其用於序列化。這可以透過在套件初始化時導入的模組中重新定義 JSONEncoder.default() 來完成。
使用 Pickle 自動序列化
更全面的解決方案涉及使用 pickle 模組pickle 不是標準 JSON 資料類型的物件。這種方法允許自動序列化大多數 Python 對象,包括使用者定義的類別實例,而不需要特殊方法。
反序列化
要反序列化 pickled 對象,需要使用自訂 object_hook可以將函數提供給 json.loads()。此函數將使用 _python_object 鍵解封對象,將它們恢復到原始 Python 狀態。
Python 3 可移植性
在 Python 3 中,json.dumps() 傳回位元組對象,需要修改 pickle 序列化。 pickle.dumps() 結果可以在 latin1 中解碼,然後在使用 pickle.loads() 之前編碼回 latin1。
範例
考慮一個名為make_json_serialized2 的模組實現了猴子補丁和基於pickle的自動序列化:
<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>
要使用此猴子補丁和基於pickle的自動序列化:
<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中文網其他相關文章!