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

Flask中返回QrRecord对象数组时JSON序列化失败的问题求助

Flask中返回QrRecord对象数组时JSON序列化失败的问题求助

嘿,我来帮你捋捋这个问题!你碰到的TypeError: Object of type type is not JSON serializable错误,核心原因是Flask的jsonify没法直接序列化SQLAlchemy的模型对象列表。而单个对象能正常返回,是因为你在toJson方法里直接调用了jsonify,返回的是一个现成的Response响应对象,Flask可以直接处理它;但数组场景下你传的是原始的模型对象列表,这些对象本身不具备JSON序列化的能力,所以就报错了。

给你两个关键修改步骤,轻松解决这个问题:

1. 修正toJson方法,返回字典而非Response对象

原来的toJson里用了jsonify,这会直接生成响应对象,不适合用来做对象序列化。我们应该让它返回纯字典,同时注意把Python的date对象转成可序列化的字符串(比如ISO格式):

class QrRecord(db.Model):
    id = db.Column(db.String(256), primary_key=True)
    name = db.Column(db.String(128), nullable=False)
    date = db.Column(db.Date, nullable=False)
    qrType = db.Column(db.String(128), nullable=False)
    count = db.Column(db.Integer, nullable=False)

    def toJson(self):
        return {
            "id": self.id,
            "name": self.name,
            "date": self.date.isoformat(),  # 将date转为ISO格式字符串,解决日期序列化问题
            "qrType": self.qrType,
            "count": self.count
        }

2. 在路由中批量序列化对象列表

现在你可以用列表推导式,把每个QrRecord对象转成字典,再传给jsonify:

@app.route("/qr", methods=["GET"])
def qr_get():
    tasks = QrRecord.query.order_by(QrRecord.date).all()
    # 遍历列表,将每个对象转为字典后再统一序列化
    return jsonify([task.toJson() for task in tasks])

这样修改后,jsonify就能正确处理这个字典列表,返回符合要求的JSON响应了。

另外补充个小建议:如果后续你有大量模型需要序列化,也可以考虑自定义Flask的JSON编码器,或者用marshmallow这类序列化库,但上面的方法是最直接轻量的,完全适配你的简单CRUD场景。

备注:内容来源于stack exchange,提问作者Daniel Nýdrle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:53:12