如何在 Python 中使自訂物件 JSON 可序列化而不實作自訂編碼器?

Barbara Streisand
發布: 2024-10-31 10:19:02
原創
286 人瀏覽過

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

在不實作自訂編碼器的情況下使自訂物件JSON 可序列化

Python 中預設的JSON 序列化機制涉及創建json.JSONEncoder 的自訂子類別來處理不可序列化的物件。雖然這種方法被廣泛使用,但對於想要在不修改呼叫者程式碼的情況下使其類別 JSON 可序列化的使用者來說可能很麻煩。

為了解決這個問題,一個潛在的解決方案涉及利用 Python 的猴子修補技術。這涉及透過在運行時更改原始程式碼來修改現有模組的行為。在這種情況下,我們可以修改 json 模組的 JSONEncoder.default() 方法來檢查正在序列化的物件中是否有特殊的「to_json」方法。如果存在這樣的方法,它可用於產生物件的 JSON 表示形式。

要實現此方法,請使用以下程式碼建立一個模組(例如make_json_serialized.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>
登入後複製

此程式碼修改JSONEncoder.default() 方法以檢查正在序列化的物件中是否有“to_json”方法。如果找到,則該方法將用於產生 JSON 表示形式。否則,將使用預設行為。

要使用此模組,只需在任何JSON 序列化操作之前導入它即可應用猴子補丁:

<code class="python">import make_json_serializable</code>
登入後複製

現在,任何帶有“to_json”方法將使用該方法進行序列化,而不需要自訂編碼器。

但是,這種方法仍然需要使用者為他們想要使 JSON 可序列化的每個類別實作自訂「to_json」方法。另一種提供更大靈活性的解決方案是使用 pickle 模組自動序列化和反序列化物件。

透過猴子修補 JSONEncoder.default() 方法來 pickle 非標準 JSON 資料型別,我們可以消除需要自訂序列化方法。但是,反序列化過程需要自訂 object_hook 函數來處理 pickle 物件。

此方法提供了一種更清晰、更通用的方法來使自訂物件 JSON 可序列化,而不需要呼叫者修改程式碼。

以上是如何在 Python 中使自訂物件 JSON 可序列化而不實作自訂編碼器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!