我有一个要序列化的 Python 对象树。它的结构是这样的:
{
"regular_object": {
...
},
"regular_field": ...
"special_object": {
"f1": "v1",
"f2": v2,
...
"fn": "vn"
}
}
我想序列化这样的对象树,以便在 JSON 表示中像这样格式化:
{
"regular_object": {
...
},
"regular_field": ...
"special_object": { "f1": "v1", "f2": v2, ..., "fn": "vn" }
}
换句话说,我想要基于被格式化对象的内容的混合格式。
我尝试json.JSONEncoder
通过覆盖其default
方法并使用自定义类对象来存储special_object
's 的内容,以便default
调用自定义,如下所示:
class SpecialObject:
def __init__(self, attrs: dict):
self.attrs = attrs
class SpecialEncoder(json.JSONEncoder):
def default(self, o):
JE = json.JSONEncoder
if isinstance(o, SpecialObject):
return f"{{ ', '.join([f'{JE.encode(self, el[0])}: {JE.encode(el[1])}' for el in o.attrs.items()]) }}"
else:
return super().default(o)
但它看起来像再次对' 的返回值进行JSONEncoder
编码,所以我为我的自定义类型生成的字符串被序列化为字符串,输出类似于:default
{
...
"special_object": "{ \"f1\": \"v1\", ..., \"fn\": \"vn\" }"
}
这显然不是我的想法。我还尝试像这里的一些答案所建议的那样覆盖该JSONEncoder.encode
方法,但是该方法永远不会从其内部被调用JSONEncoder
。
我确实找到了几种 解决看似相似问题的方法,但是那里提出的解决方案看起来太怪异,而且对于像我这样的任务来说过于复杂。有没有办法只用一两打代码就可以实现我需要的东西,而不会深入到JSONEncoder
's 的肠子里?它不需要是一个通用的解决方案,只是我可以快速修复并且可能仅适用于单个案例的东西。