Skip to content

Returning JSON Data

APIs most commonly return JSON.

Returning dicts (Flask 2+)

Flask can automatically serialize dicts:

from flask import Flask
 
app = Flask(__name__)
 
 
@app.route("/api/status")
def api_status():
    return {"status": "ok"}
from flask import Flask
 
app = Flask(__name__)
 
 
@app.route("/api/status")
def api_status():
    return {"status": "ok"}

Using jsonify

jsonify()jsonify() gives you more control and is explicit:

from flask import Flask, jsonify
 
app = Flask(__name__)
 
 
@app.route("/api/user")
def api_user():
    return jsonify(id=1, name="Ravi")
from flask import Flask, jsonify
 
app = Flask(__name__)
 
 
@app.route("/api/user")
def api_user():
    return jsonify(id=1, name="Ravi")

Status codes

Return a tuple to include a status code:

@app.route("/api/create", methods=["POST"])
def api_create():
    return {"created": True}, 201
@app.route("/api/create", methods=["POST"])
def api_create():
    return {"created": True}, 201

Common pitfalls

  • Returning objects that aren’t JSON-serializable (e.g., datetime)
    • fix: convert to string or use a serializer
  • Doing return json.dumps(data)return json.dumps(data) without setting Content-Type: application/jsonContent-Type: application/json
    • fix: use dict return or jsonifyjsonify

πŸ§ͺ Try It Yourself

Exercise 1 – Create a Flask App

Exercise 2 – Dynamic Route

Exercise 3 – Return JSON

If this helped you, consider buying me a coffee β˜•

Buy me a coffee

Was this page helpful?

Let us know how we did