さて、また管理部に全く関係ない内容ですが、ご勘弁ください。
今回はflaskのjsonifyとpython jsonモジュールのdumpsの違いを簡単に解説していきたいと思います。今回の記事もflaskを教えている時に聞かれた内容がベースになっています。
jsonモジュールがよく理解できていない方は以下の記事をご参照ください。
jsonifyを使うケース
基本的にはwebAPIなどを実装する場合、レスポンスとしてjsonを返すことになりますが、jsonifyを使うとよしなにdict型のデータをjsonにしてくれます。
でも、dict型データをjsonにしてくれるだけであれば、jsonモジュールでdumpsを使用すれば同じことが可能ですよね?何が違うんでしょうか?
jsonifyとjson.dumpsの違い
それでは、本題のjsonifyとjson.dumpsの違いをみていきましょう。サンプルとして2つのエンドポイントを作成して、それぞれjsonifyとjson.dumpsでデータを返して違いをみていきます。
サンプルコード
それでは、今回利用するサンプルコードを以下に貼り付けます。
from flask import Flask
from flask import jsonify
import json
app = Flask(__name__)
@app.route("/api/getinfo", methods=["get"])
def getinfo():
"""
getinfo api createby json.dumps
:return: json
"""
header_info = request.headers
print(header_info)
info = {"name":"test1",
"age":25}
return json.dumps(info)
@app.route("/api/getinfo2", methods=["get"])
def getinfo2():
"""
getinfo2 api createby jsonify
:return: json
"""
info = {"name":"test1",
"age":25}
return jsonify(info)
if __name__ == '__main__':
app.run(debug=True)
実行結果
json.dumpsでレスポンスを作成した場合
それでは、まずapi/getinfoを実行した場合の実行結果をみてみましょう。

htmlでjson化された、dictのデータ(info変数に代入したデータ)が表示されていることがわかります。
注目して欲しいのは、検証画面→Network→Headersに表示される、Response HeadersのContent-Typeになります。
json.dumpsでjson化させたデータをレスポンスさせた場合、text/htmlが返っていることがわかります。
jsonifyでレスポンスを作成した場合
次にjsonifyでレスポンスを作成した場合をみていきます。

htmlでjson化された、dictのデータ(info変数に代入したデータ)が表示されていることがわかります。ここは、json.dumpsと変わりません。
さて、注目して欲しいとjson.dumpsの部分で説明した、responseの content-typeはどうでしょうか?
jsonifyでjson化させたデータをレスポンスさせた場合、application/jsonが返っていることがわかりますね。
ここが大きな違いです。
結局違いは何か?
違いはresponse headerを自動的に変更してくれるかどうかという点です。
自動的に変更してくれない、json.dumpsの場合、自分でheaderのcontent-typeを指定し直さないといけません。めんどくさいですね。。
ここを自動的に変更してくれるのが、jsonifyの一番いいところです。
json.dumpsはもともとpythonモジュールで、jsonifyはflaskのモジュールですので、そもそも想定される前提が違うので、このような処理の違いを生んでいます。
まとめ
今回はjsonifyとjson.dumpsの違いについてみてきました。
response headerのcontent-typeを自動的に変更してくれるjsonifyを利用する方が便利ですね。
この頃管理部関係ない記事が続いちゃってますね。。少しの間python/flask関係の話が続く可能性がありますが、ご容赦ください。
それでは、また。