You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3.8自定义对象列表转JSON失败的解决方法咨询

解决自定义Person类对象列表的JSON序列化问题

首先得帮你揪出两个容易忽略的小问题:

  1. 你的Person类__init__方法里有个拼写错误:self.tite = Title应该是self.title(少了个字母l);
  2. 你重复给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:42:36