如何在沒有自訂編碼器的情況下使自訂物件 JSON 可序列化?

Mary-Kate Olsen
發布: 2024-11-01 03:21:40
原創
280 人瀏覽過

How to Make Custom Objects JSON Serializable without Custom Encoders?

在沒有自訂編碼器的情況下使自訂物件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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板