在没有自定义编码器的情况下使自定义对象 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中文网其他相关文章!