3秒でわかる
Flask で dict や list を JSON のレスポンスに変換して返す関数。ヘッダまで正しく設定してくれるので API 実装の基本になります。
もう少し詳しく
どういうものか
Flask が用意している関数で、Python の dict や list を JSON に直し、Content-Type を application/json に設定した Response オブジェクトを作って返します。ビュー関数の戻り値としてそのまま使えます。Flask 2 系以降は list をトップレベルに渡すこともでき、内部のシリアライズ設定はアプリごとに差し替えられます。
なぜ必要か
ビュー関数が文字列を返すと、Flask はそれを HTML とみなして Content-Type を text/html にします。中身が JSON の形をしていても、受け取ったブラウザや fetch は JSON として扱わないため、クライアント側で自前のパースが必要になります。jsonify を使うと、変換とヘッダ設定が一度に済み、日本語や入れ子の扱いも Flask 側の設定に従って一貫します。
具体例
from flask import Flask, jsonify, request
app = Flask(__name__)
app.json.ensure_ascii = False # 日本語をそのまま出す
users = [{"id": 1, "name": "田中"}, {"id": 2, "name": "鈴木"}]
@app.get("/api/users")
def list_users():
return jsonify(users)
@app.get("/api/users/<int:user_id>")
def get_user(user_id):
for u in users:
if u["id"] == user_id:
return jsonify(u)
return jsonify({"error": "not found"}), 404つまずきやすいところ
似た用語との違い
| 呼び出し | 戻るもの | Content-Type |
|---|---|---|
| jsonify(obj) | Response オブジェクト | application/json |
| json.dumps(obj) | 文字列 | text/html のまま |
| make_response(...) | Response オブジェクト | 自分で設定する |