gpt4 book ai didi

python - 将多个类序列化为 JSON

转载 作者:行者123 更新时间:2023-12-04 01:19:08 25 4
gpt4 key购买 nike

我有一个 A 类,它存储了 B 类型变量的集合,我该如何正确地将 A 类序列化为 JSON?

例子:

class A:
def __init__(self):
self.b_collection = []
#...

class B:
def __init__(self):
# ...
pass

并将 B 的实例添加到集合中:

a = A()
a.b_collection = [B(), B(), B()]

当我尝试使用 json.dumps(a) 序列化 a 时出现此错误:Object of type A is not JSON serializable .

有没有办法指定编码器应该如何编码那个类?

有点像

def __encode__(self, encoder):
encoder.start_obj()
encoder.add_property('name', self.value)
encoder.add_property('age', self.age)
encoder.end_obj()

这会返回类似的东西

{
name: 'Tomer',
age: '19'
}

最佳答案

您可以扩展 json.JSONEncoder 来定义如何序列化您的对象。子类的 default 方法将一个 Python 对象作为参数。您可以返回一个(希望)可编码的新对象,或者将该对象传递给父对象,希望它知道如何对该对象进行编码。

例如,

class A:
def __init__(self):
self.b_collection = []

class B:
def __init__(self, name, age):
self.name = name
self.age = age


class ABEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, A):
return {'__A__': obj.b_collection}
elif isinstance(obj, B):
return {'__B__': obj.__dict__}
return super().default(obj)


a = A()
a.b_collection.append(B("Tomer", "19"))
a.b_collection.append(B("Bob", "21"))
a.b_collection.append(B("Alice", "23"))
print(json.dumps(a, cls=ABEncoder, indent=4))

会产生

{
"__A__": [
{
"__B__": {
"name": "Tomer",
"age": "19"
}
},
{
"__B__": {
"name": "Bob",
"age": "21"
}
},
{
"__B__": {
"name": "Alice",
"age": "23"
}
}
]
}

请注意,您可以分别处理AB;在返回 A 的可编码形式之前,您不必先对 B 对象进行编码; B 对象将在稍后对列表本身进行编码时进行编码。

额外的对象使得编写解码器变得更容易;如果您不想将 JSON 解码为 A 的实例,则不必使它变得如此复杂。相反,您可以定义

class ABEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, A):
return obj.b_collection
elif isinstance(obj, B):
return obj.__dict__
return super().default(obj)

得到

[
{
"name": "Tomer",
"age": "19"
},
{
"name": "Bob",
"age": "21"
},
{
"name": "Alice",
"age": "23"
}
]

关于python - 将多个类序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62850883/

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