Typeerror: Object of Type Is Not Json Serializable

I'm wrote rest on the Flask using 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: Object of type 'Version' is not JSON serializable

3

4 Answers

You probably want to use ModelSchema instead of Schema.

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

ModelSchema dumps the related foreign key objects as a list of id(s) by default which is JSON serializable.

2

In order to use jsonify() you have to make serializable the class you need to jsonify. Add to that class a function similar to the following:

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}

And then jsonify de serializaed version of the object, and not the objetc itself:

jsonify(result.serialize())

This method work for me

class User(db.Model, Timestamp):
   id = db.Column(db.Integer, primary_key=True)
   name = db.Column(db.String(20), nullable= False)
   email = db.Column(db.String(40), unique = True, nullable= False)

   def toDict(self):
       return dict(id=self.id, name=self.id email=self.email)

and

return jsonify([s.toDict() for s in admins])
1

Try with json.dumps() and json.loads()

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Maya Lin-Takahashi

Maya Lin-Takahashi

Consumer Tech & Gadget Reviewer

Maya is a hardware enthusiast who tests and reviews smart home devices, smartphones, wearables, and audio gear. She focuses on practical consumer value and build quality.

Share this article
Twitter Facebook Pinterest