json.dumpsとフラスコ。jsonify


276

このflask.jsonify方法の目的が理解できません。私はこれからJSON文字列を作成しようとします:

data = {"id": str(album.id), "title": album.title}

しかし、私が得るものは、私が得るものとjson.dumpsは異なりflask.jsonifyます。

json.dumps(data): [{"id": "4ea856fd6506ae0db42702dd", "title": "Business"}]
flask.jsonify(data): {"id":…, "title":…}

明らかに、json.dumps返ってくるものに似た結果を取得する必要があります。何が悪いのですか?

回答:


370

jsonify()Flask の関数はflask.Response()、json応答で使用するための適切なcontent-typeヘッダー 'application / json'がすでにあるオブジェクトを返します。一方、json.dumps()メソッドはエンコードされた文字列を返すだけなので、MIMEタイプヘッダーを手動で追加する必要があります。

完全なリファレンスについては、ここjsonify()関数の詳細を参照してください。

編集:また、jsonify()がクワーグや辞書を処理する一方でjson.dumps()、リストなどをサポートすることにも気付きました。


31
jsonify()リストを処理します。このコミットをご覧ください。
Jeff Widman、2016年

3
しかし、SQLAlchemyオブジェクトとリストをJSONに変換しません。
ajbraus

91

できるよ:

flask.jsonify(**data)

または

flask.jsonify(id=str(album.id), title=album.title)

82

これは flask.jsonify()

def jsonify(*args, **kwargs):
    if __debug__:
        _assert_have_json()
    return current_app.response_class(json.dumps(dict(*args, **kwargs),
        indent=None if request.is_xhr else 2), mimetype='application/json')

json使用されるモジュールのいずれかであるsimplejsonか、jsonそのために。オブジェクト、つまりアプリケーションcurrent_appへの参照Flask()です。クラスresponse_class()への参照Response()です。


42

どちらを選択するかは、何をするかによって異なります。私が理解していることから:

  • jsonifyは、誰かがクエリを実行してjsonを期待するAPIを構築している場合に役立ちます。例:REST github APIはこのメソッドを使用してリクエストに応答できます。

  • dumpsは、data / pythonオブジェクトをjsonにフォーマットし、アプリケーション内でそれを処理することに関するものです。たとえば、JavaScriptがグラフを表示するリプレゼンテーションレイヤーにオブジェクトを渡す必要があります。ダンプによって生成されたJsonをJavaScriptにフィードします。


4
違いが全然わかりません。
vidstige 2015年

11
@vidstige:jsonifyは、ヘッダーが "content-type:application / json"に設定されたフラスコ.Response()オブジェクトを作成し、ペイロードは、JSON文字列に変換されたdictに設定されます。ダンプは単にJSONに変換された文字列を作成します。これは、適切にフォーマットされたフラスコではありません。Response()オブジェクトです。したがって、ビューに「return json.dumps(dict)」と表示されている場合、受信者はjson.dumps出力をペイロードとして含む通常の「content-type:text / html」応答を取得します。
SamEsla

3
@SamEslaはい、わかりますが、この回答にはその情報は含まれていません。
vidstige 2018

0

検討する

data={'fld':'hello'}

jsonify(data)

{'fld': 'hello'}を生成し、

json.dumps(data)

与える

"<html><body><p>{'fld':'hello'}</p></body></html>"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.