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
相关产品推荐
相关产品推荐

