你可以扩展
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"
}
}
]
}
请注意,你可以分别处理
A
和
B
;在返回可编码的
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"
}
]
a
的?使用json.dumps(a)
吗? - chepner