Flask中jsonify返回自定义类对象列表提示JSON不可序列化如何解决
Flask自定义类JSON序列化报错解决方案
报错原因:Flask的
jsonify方法底层依赖Python标准库的json模块,默认仅支持序列化字符串、数字、布尔值、None、列表、字典等内置类型,无法直接序列化自定义类实例。你之前尝试的方案未生效大概率是实现逻辑存在疏漏,可参考以下可行方案:
方案1:手动转换实例为字典列表后传入jsonify
该方案无需修改全局配置,适合临时场景使用,正确实现逻辑如下:
- 为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 }
- 接口逻辑中先遍历实例列表转为字典列表,再传给
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
相关产品推荐
相关产品推荐

