首页  >  文章  >  后端开发  >  如何在没有自定义编码器的情况下使自定义对象 JSON 可序列化?

如何在没有自定义编码器的情况下使自定义对象 JSON 可序列化?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 03:21:40226浏览

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>

要使用此模块,只需导入它,序列化将自动应用:

<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn