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

Flask中jsonify返回自定义类对象列表提示JSON不可序列化如何解决

Flask自定义类JSON序列化报错解决方案

报错原因:Flask的jsonify方法底层依赖Python标准库的json模块,默认仅支持序列化字符串、数字、布尔值、None、列表、字典等内置类型,无法直接序列化自定义类实例。你之前尝试的方案未生效大概率是实现逻辑存在疏漏,可参考以下可行方案:

方案1:手动转换实例为字典列表后传入jsonify

该方案无需修改全局配置,适合临时场景使用,正确实现逻辑如下:

  1. 为Pet类实现to_dict方法,返回纯内置类型组成的字典
class Pet:
    def __init__(self, pet_id, name, species, age):
        self.pet_id = pet_id
        self.name = name
        self.species = species
        self.age = age
    
    def to_dict(self):
        # 确保所有返回值都是Python内置可序列化类型
        return {
            "pet_id": self.pet_id,
            "name": self.name,
            "species": self.species,
            "age": self.age
        }
  1. 接口逻辑中先遍历实例列表转为字典列表,再传给jsonify
@app.route("/api/v1/resources/pets/all")
def get_all_pets():
    # pets为你的Pet实例列表数据源
    pets = [Pet(1, "橘猫", "猫", 2), Pet(2, "边牧", "狗", 3)]
    serializable_pets = [item.to_dict() for item in pets]
    return jsonify(serializable_pets)

方案2:自定义全局JSON序列化器(适合多场景复用)

如果项目中多处需要返回Pet类实例,可直接修改Flask的默认JSON编码器,后续无需每次手动转换:

from flask.json import JSONEncoder

# 自定义JSON编码器
class CustomJSONEncoder(JSONEncoder):
    def default(self, obj):
        # 匹配到Pet类实例时自动调用to_dict方法转换
        if isinstance(obj, Pet):
            return obj.to_dict()
        # 其他类型走默认序列化逻辑
        return super().default(obj)

# 将自定义编码器绑定到Flask应用实例,注意要在注册路由前执行
app.json_encoder = CustomJSONEncoder

配置完成后原有的return jsonify(pets)代码无需修改即可正常运行。

常见失效原因排查

如果之前的尝试未生效,可优先检查以下问题:

  • 转换后的字典列表仍嵌套了其他自定义类、函数、datetime等不可序列化的非内置类型
  • 全局编码器未正确绑定到Flask应用实例,或绑定操作在路由注册之后执行
  • Pet类的to_json/to_dict方法返回值不是纯字典结构,仍包含实例引用

内容的提问来源于stack exchange,提问作者d.braun1991

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:54:04