- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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"
}
}
]
}
请注意,您可以分别处理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"
}
]
关于python - 将多个类序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62850883/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!