关于python:对象不是Json可序列化的吗?

Object is not Json serializable?

本问题已经有最佳答案,请猛点这里访问。

我想询问一下这些模型。

例如,名为"demo"的模型名,我想获取表的所有记录。

1
2
3
4
5
6
class Demo(db.Model):

   __tablename__ ="demo"

   field_1 = db.Column(db.String(255), nullable=False)
   field_2 = db.Column(db.String(255), nullable=False)

现在我在质疑

1
records = Messages.query.all()

我正试图发送记录作为响应,所以我面临这个错误。我是新来的,请帮我把它整理一下。


sqlAlchemy返回resultProxy对象,最简单/最简单的处理方法是动态序列化。许多python数据类型由于明显的原因不以本机方式序列化到json。

要使其干净输出,请尝试以下操作:

1
2
3
4
5
6
7
8
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 datetime之类的类型,或者其他不以本机方式序列化到JSON的特殊类型。

更高级的方法是将序列化方法直接附加到模型定义,例如:

1
2
3
4
5
6
7
8
9
10
11
12
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"),
        }

然后您可以直接将其用作:

1
records = [z.to_json() for z in Messages.query]