Python3.8自定义对象列表转JSON失败的解决方法咨询
解决自定义Person类对象列表的JSON序列化问题
首先得帮你揪出两个容易忽略的小问题:
- 你的
Person类__init__方法里有个拼写错误:self.tite = Title应该是self.title(少了个字母l); - 你重复给
self.link赋值了——先是self.link = Link,紧接着又self.link = Snippet,这会直接覆盖掉原本的Link值,应该改成self.snippet = Snippet,不然你的对象永远存不了正确的链接数据。
回到你遇到的JSON序列化报错:Python的json模块默认只认识内置类型(字典、列表、字符串、数字这些),自定义类的对象它不知道该怎么转换成JSON格式,所以才会抛出TypeError。这里给你三种实用的解决办法:
方法1:手动转成字典列表
这是最直接的方式,把每个Person对象转换成字典后再序列化:
import json # 先修正Person类的定义 class Person: def __init__(self, Title, Link, Snippet): self.title = Title self.link = Link self.snippet = Snippet # 创建对象列表 person_list = [] person_list.append(Person("a","b","c")) person_list.append(Person("d","e","f")) # 转换为字典列表再序列化 dict_list = [{"title": p.title, "link": p.link, "snippet": p.snippet} for p in person_list] json_result = json.dumps(dict_list) print(json_result)
方法2:给Person类添加to_dict方法
在类里封装一个转换为字典的方法,代码更整洁,也方便后续复用:
import json class Person: def __init__(self, Title, Link, Snippet): self.title = Title self.link = Link self.snippet = Snippet # 新增转换方法,返回对象的字典表示 def to_dict(self): return { "title": self.title, "link": self.link, "snippet": self.snippet } person_list = [Person("a","b","c"), Person("d","e","f")] # 调用to_dict生成字典列表后序列化 json_result = json.dumps([p.to_dict() for p in person_list])
方法3:自定义JSON编码器
如果需要频繁序列化Person对象,自定义编码器会更优雅,不用每次手动转字典:
import json class Person: def __init__(self, Title, Link, Snippet): self.title = Title self.link = Link self.snippet = Snippet # 自定义编码器,继承JSONEncoder class PersonEncoder(json.JSONEncoder): def default(self, obj): # 识别Person对象,返回对应的字典结构 if isinstance(obj, Person): return { "title": obj.title, "link": obj.link, "snippet": obj.snippet } # 其他类型交给父类的默认方法处理 return super().default(obj) person_list = [Person("a","b","c"), Person("d","e","f")] # 序列化时指定cls参数为自定义编码器 json_result = json.dumps(person_list, cls=PersonEncoder)
三种方法都能解决你的问题,按需选择就行:如果只是偶尔序列化,方法1足够用;如果类需要经常转字典,方法2更合适;如果项目里有很多自定义类要序列化,方法3的扩展性更好。
内容的提问来源于stack exchange,提问作者the gamer x
相关产品推荐
相关产品推荐

