对象不是 Json 可序列化的? [复制]
Posted
技术标签:
【中文标题】对象不是 Json 可序列化的? [复制]【英文标题】:Object is not Json serializable? [duplicate] 【发布时间】:2018-08-16 17:59:48 【问题描述】:我正在尝试查询模型。
例如模型名称为“Demo”,我想获取该表的所有记录。
class Demo(db.Model):
__tablename__ = "demo"
field_1 = db.Column(db.String(255), nullable=False)
field_2 = db.Column(db.String(255), nullable=False)
现在我正在查询
records = Messages.query.all()
我正在尝试将记录作为响应发送,所以我遇到了这个错误。我是flask新手,请帮我整理一下。
【问题讨论】:
【参考方案1】:SQLAlchemy 返回一个 ResultProxy 对象,处理这个最简单/最简单的方法是动态序列化它。由于显而易见的原因,许多 python 数据类型不会原生序列化为 JSON。
要让这个输出干净,试试这个:
def serialize_message(msg):
return
"field_str": msg.field_str,
"field_int": int(msg.field_int),
"field_dt": msg.field_dt.strftime("%Y%m%d"),
records = [serialize_message(z) for z in Messages.query]
通过这种方式,您可以根据需要修改类型,例如 python 日期时间,或其他不原生序列化为 JSON 的特殊类型。
更高级的方法是将序列化方法直接附加到模型定义中,例如:
class Demo(db.Model):
__tablename__ = "demo"
field_str = db.Column(db.String(255), nullable=False)
field_int = db.Column(db.Integer, nullable=False)
field_dt = db.Column(db.DateTime, nullable=False)
def to_json(self):
return
"field_str": self.field_str,
"field_int": int(self.field_int),
"field_dt": self.field_dt.strftime("%Y%m%d"),
那你就可以直接用这个了:
records = [z.to_json() for z in Messages.query]
【讨论】:
谢谢!简单实用。以上是关于对象不是 Json 可序列化的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
QuerySet 类型的对象不是 JSON 可序列化的 Django