gpt4 book ai didi

python - 支持嵌套类型中自定义类的默认序列化

转载 作者:行者123 更新时间:2023-12-01 02:04:27 26 4
gpt4 key购买 nike

我定义了一个类 A,并且我在其他类、容器和嵌套类型中使用 A 的对象。

示例

a = A()
b = [a,3,'hello'
c = {'hey': b, 'huy': 3}
d = [a,b,c]

我对 d 的 json 表示形式感兴趣,因此我当然必须指定在遇到 A 实例时如何表现。

对于“A”类的对象,我想得到这个(请注意,我正在跳过 att2,这表明我不知道如何使用像 a.__dict__ 这样的东西):

{
class_name = 'A',
att1 = '<value of att1>',
att3 = '<value of att3>'
}

att1 可以是任何东西:A 实例、默认类型等。

我希望能够调用 json.dumps(d) 并获得所需的输出,所以我想做的是告诉类 A 什么当 json 序列化器询问时输出。

我环顾四周,只找到了复杂的解决方案,其中将 lambda 或类传递给 json.dumps() 并且我不明白为什么不直接覆盖由json 序列化程序,例如覆盖 __str__()__repr__() 时。

也许这是不可能的?在这种情况下,对于我来说,什么是简单的解决方案?请注意,在我的实际问题中,我不仅有类 A,还有嵌套在一起的各种自定义类,因此覆盖默认序列化程序将是自然且更简单的解决方案。

我的尝试之一

我正在尝试遵循 encoder.py 第 160 行的建议

因此从 json.JSONEncoder 继承 A 并声明了该方法

def default(self,obj):
return 'valid custom json representation of A'

但这不起作用,并且引发了上述链接第 179 行的异常。我的代码有什么问题吗?

最佳答案

默认的 JSON 编码器(您链接到的)只知道如何处理“简单”的事物,例如字典、列表、字符串和数字。它不会尝试序列化类,因此您无法在类上实现“特殊”方法来使其可 JSON 序列化。基本上,如果您想使用 json.dumps,您将必须传递一些额外的内容才能使其与您的自定义类一起使用。

当编码器不知道如何处理对象时,它会调用default方法。根据您的问题,我相信您已经发现了这一点,但您对 default 方法应该去哪里有点困惑。这是一个可以满足您需求的示例:

import json

def default(o):
if hasattr(o, 'to_json'):
return o.to_json()
raise TypeError(f'Object of type {o.__class__.__name__} is not JSON serializable')

class A(object):
def __init__(self):
self.data = 'stuff'
self.other_data = 'other stuff'

def to_json(self):
return {'data': self.data}

a = A()
b = [a, 3, 'hello']
c = {'hey': b, 'huy': 3}
d = [a, b, c]

print(json.dumps(d, default=default))

打印出:

[{"data": "stuff"}, [{"data": "stuff"}, 3, "hello"], {"hey": [{"data": "stuff"}, 3, "hello"], "huy": 3}]

请注意,每个自定义类现在只需要实现 to_json 方法,所有内容都会正确序列化(假设您在调用 json 时传递自定义 default 函数) .dumps)。

关于python - 支持嵌套类型中自定义类的默认序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49209226/

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