Python嵌套数据类JSON序列化报错问题及解决方法问询
问题解决:Python Dataclass嵌套类的JSON序列化问题
原代码核心问题
- 类定义语法错误:
@dataclass装饰的类必须用标准class关键字定义,且myClass.item2的类型注解应写mySubClass(类本身),而非mySubClass()(实例)。 - JSON序列化不支持Dataclass:Python标准
json.dumps默认无法识别dataclass实例,嵌套的mySubClass实例会触发TypeError。
你的疑问解答
用__post_init__把myClass.item2转为JSON字符串是错误思路——这会让最终JSON里的item2变成字符串值,而非你需要的嵌套对象结构,完全不符合目标格式。
正确处理方案
步骤1:修正Dataclass定义
先修复类定义的语法错误:
import json from dataclasses import dataclass, asdict from types import SimpleNamespace @dataclass class mySubClass: sub_item1: str sub_item2: str @dataclass class myClass: item1: str item2: mySubClass # 正确标注类型,而非实例
步骤2:解析JSON到对象(原逻辑可保留)
用SimpleNamespace解析JSON的代码没问题,可直接沿用:
received_json_str = '{"item1": "old_item1", "item2": {"sub_item1": "old_sub1", "sub_item2": "old_sub2"}}' convert_new_jsonStr_toObj = json.loads(received_json_str, object_hook=lambda d: SimpleNamespace(**d)) # 模拟业务处理:修改字段值 convert_new_jsonStr_toObj.item1 = "new_item1" convert_new_jsonStr_toObj.sub_item1 = "new_sub_item1" convert_new_jsonStr_toObj.sub_item2 = "new_sub_item2"
步骤3:序列化Dataclass实例到JSON
有两种原生方法实现正确序列化:
方法1:用dataclasses.asdict()转字典后序列化
把dataclass实例转为Python原生字典,再用json.dumps处理:
# 构造myClass实例 my_instance = myClass( item1=convert_new_jsonStr_toObj.item1, item2=mySubClass( sub_item1=convert_new_jsonStr_toObj.sub_item1, sub_item2=convert_new_jsonStr_toObj.sub_item2 ) ) # 转字典后序列化,得到目标格式 processed_json_str = json.dumps(asdict(my_instance), indent=2)
输出结果完全符合需求:
{ "item1": "new_item1", "item2": { "sub_item1": "new_sub_item1", "sub_item2": "new_sub_item2" } }
方法2:自定义JSON编码器(支持直接dump实例)
如果需要频繁序列化dataclass,可自定义编码器避免每次手动转字典:
class DataclassJSONEncoder(json.JSONEncoder): def default(self, obj): # 判断是否为dataclass实例 if hasattr(obj, '__dataclass_fields__'): return asdict(obj) # 其他类型沿用默认逻辑 return super().default(obj) # 直接序列化myClass实例 processed_json_str = json.dumps(my_instance, cls=DataclassJSONEncoder, indent=2)
总结
- 不要用
__post_init__把嵌套类转成JSON字符串,会破坏目标结构 - 修正dataclass定义的语法错误是前提
- 用
asdict()转字典或自定义编码器,即可实现嵌套dataclass的正确JSON序列化
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

