对象不是 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 可序列化的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

对象不是 JSON 可序列化的

QuerySet 类型的对象不是 JSON 可序列化的 Django

[错误]:返回的对象不是 JSON 可序列化的

方法对象不是 JSON 可序列化的

Celery EncodeError(TypeError('响应类型的对象不是 JSON 可序列化的'))

“Mycart”类型的对象在 Django 中不是 JSON 可序列化的