TypeError:类型的对象不可JSON序列化

时间:2019-10-11 14:31:44

标签: json flask serialization flask-restful

我用rest在烧瓶上写了flask-marshmallow

models.py

class Application(db.Model):
    __tablename__ = 'applications'

    id = db.Column(db.String(), primary_key=True)
    name = db.Column(db.String())
    versions = db.relationship('Version', backref='application', lazy=True)

    def __repr__(self):
        return '<application {}>'.format(self.name)


class Version(db.Model):
    __tablename__ = 'versions'

    id = db.Column(db.String(), primary_key=True)
    file = db.Column(db.String(80), nullable=True)
    application_id = db.Column(db.Integer, db.ForeignKey('applications.id'))

shemas.py

class ApplicationDetailSchema(ma.Schema):
    class Meta:
        fields = ('id', 'name', 'versions')

routes.py

@bp.route("/<id>")
def application_detail(id):
    application = Application.query.get(id)
    result = application_detail_schema.dump(application)
    return jsonify(result)
  

TypeError:“版本”类型的对象不可JSON序列化

3 个答案:

答案 0 :(得分:1)

您可能希望使用ModelSchema而不是Schema

class ApplicationDetailSchema(ma.ModelSchema):
    class Meta:
        model = Application
        fields = ('id', 'name', 'versions')

ModelSchema在默认情况下将相关的外键对象作为ID列表转储,该列表是JSON可序列化的。

答案 1 :(得分:0)

要使用jsonify(),必须将需要进行json化的类序列化。向该类添加一个类似于以下内容的函数:

class Version(db.Model):
    __tablename__ = 'versions'

    id = db.Column(db.String(), primary_key=True)
    file = db.Column(db.String(80), nullable=True)
    application_id = db.Column(db.Integer, db.ForeignKey('applications.id'))

    def serialize(self):
        return {"id": self.id,
                "file": self.file,
                "application_id": self.application_id}

然后对对象的序列化版本(而不是objetc本身)进行jsonify:

jsonify(result.serialize())

答案 2 :(得分:-2)

尝试使用json.dumps()和json.loads()

https://docs.python.org/3/library/json.html