flask jsonify vs json.dumps 違いを簡単に解説

API関連
この記事は約4分で読めます。

さて、また管理部に全く関係ない内容ですが、ご勘弁ください。

今回はflaskのjsonifyとpython jsonモジュールのdumpsの違いを簡単に解説していきたいと思います。今回の記事もflaskを教えている時に聞かれた内容がベースになっています。

jsonモジュールがよく理解できていない方は以下の記事をご参照ください。

Advertisements

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関係の話が続く可能性がありますが、ご容赦ください。

それでは、また。

コメント