Search code examples
jsonrestflaskflask-sqlalchemyjsonify

Return JSON array of objects in Flask


I am working on a simple CRUD application and I can't return an array of objects in Flask.

My db Model is like this:

class QrRecord(db.Model):
  id = db.Column(db.String(256), primary_key=True)
  name = db.Column(db.String(128), nullable=False)
  date = db.Column(db.Date, nullable=False)
  qrType = db.Column(db.String(128), nullable=False)
  count = db.Column(db.Integer, nullable=False)

  def toJson(self):
    return jsonify(
      {
        "id": self.id,
        "name": self.name,
        "date": self.date,
        "qrType": self.qrType,
        "count": self.count
      }
    )

And I am trying to return it like so:

@app.route("/qr", methods=["GET"])
def qr_get():
  tasks: list = QrRecord.query.order_by(QrRecord.date).all()
  return jsonify(tasks)

The error I get is:

<title>TypeError: Object of type type is not JSON serializable
  // Werkzeug Debugger</title>

When I am returning one single object as return return tasks[0].toJson(), it works just fine. The same when I would return an array of anything else, just like return jsonify([1, 2, 3]).

Would anybody know how to return the array of QrRecords? I feel like I have tried every solution already.


Solution

  • This answer has already been more or less answered to here: How to serialize SqlAlchemy result to JSON?

    Using @dataclass together with statically typed params helped:

    @dataclass
    class QrRecord(db.Model):
      id: str = db.Column(db.String(256), primary_key=True)
      name: str = db.Column(db.String(128), nullable=False)
      date: datetime = db.Column(db.Date, nullable=False)
      qrType: str = db.Column(db.String(128), nullable=False)
      count: int = db.Column(db.Integer, nullable=False)
    
    @app.route("/qr", methods=["GET"])
    def qr_get():
      tasks: list = QrRecord.query.order_by(QrRecord.date).all()
      return jsonify(tasks)