gpt4 book ai didi

python - 如何 json 序列化自定义可迭代对象?

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:12 25 4
gpt4 key购买 nike

我想创建一个行为类似于命名元组的类型,除了它具有自定义表示形式,在序列化为 JSON 时也遵循这一点。

天真的书本方法是这样的:

from typing import NamedTuple
import json


class MyPair(NamedTuple):
left: str
right: str

def __repr__(self):
return self.left + ':' + self.right


class MyJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, MyPair):
return str(obj)
return json.JSONEncoder.default(self, obj)

现在 print(MyPair('a', 'b')) 将按预期输出 a:b,但是 print(json.dumps([ MyPair('a', 'b')], cls=MyJSONEncoder)) 将生成 [["a", "b"]] 因为 default() 仅在对象不能原始序列化为 JSON 时调用。因为我自己的类型是一个元组,所以在我有机会干预之前它会被序列化。

在不使 MyPair 不是 Tuple 或在替换所有的预处理步骤中迭代整个文档的情况下,是否有任何好的或不太好的方法来实现这一点MyPair 字符串对象?

编辑:为了解决 Joran 的回答,我仍然希望保留序列化仅包含偶尔的 MyPair 的复杂树的能力。对不起,我的最小示例可能没有说清楚。

最佳答案

只包含默认参数

def my_class_encoder(o):
if isinstance(o,MyClass):
return repr(o)

json.dumps(myClassInstance,default=my_class_encoder)

它比真正的编码器更容易处理

....

但实际上只是给你的类添加一个 def

class MyPair(NamedTuple):
left: str
right: str
def serialize(self):
return list(self)
def __repr__(self):
return self.left + ':' + self.right

然后就

 json.dumps(myClassInstance.serialize())

这样做的好处是更清楚它在做什么(至少恕我直言)

关于python - 如何 json 序列化自定义可迭代对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53194044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com