2011-10-26 70 views
162

我不確定我瞭解flask.jsonify方法的用途。我試圖從該做一個JSON字符串:json.dumps vs flask.jsonify

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回報。我究竟做錯了什麼?

+2

在websockets上寫了一個很長的問題,當我偶然發現這個時,爲什麼'jsonify'沒有返回正確的數據。原來'json.dumps'正是我所需要的。 –

回答

206

在燒瓶中的jsonify()函數返回已具有適當的內容類型報頭「應用/ JSON」的使用JSON使用flask.Response()對象響應。而json.dumps()方法只會返回一個編碼字符串,這需要手動添加MIME類型標題。

查看更多關於jsonify()函數here的全部參考。

編輯: 另外,我注意到,jsonify()處理kwargs或詞典,同時還json.dumps()支持列表等。

+15

'jsonify()'現在處理列表。看到[這個提交](https://github.com/mitsuhiko/flask/commit/431db2874b242316051963d9bc4d5653b3647acc)。 –

78

可以執行:

flask.jsonify(**data) 

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

這是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或以該順序jsoncurrent_app是對Flask()對象(即您的應用程序)的引用。 response_class()是對Response()類的參考。

+2

這應該是正確的答案... – tyan

20

一個或另一個的選擇取決於你打算做什麼。 從什麼我明白:當你構建一個API會有人詢問,並期望在返回JSON

  • jsonify將是有益的。例如:REST github API可以使用此方法來回答您的請求。

  • 轉儲,更多的是將數據/ python對象格式化爲json,並在你的應用程序中使用它。例如,我需要將一個對象傳遞給我的表示層,其中一些JavaScript將顯示圖形。您將使用由轉儲生成的Json提供javascript。

+1

我根本不瞭解它們之間的區別。 – vidstige

+5

@vidstige:** jsonify **製作一個燒瓶。將其頭文件設置爲「content-type:application/json」的Response()對象,其有效負載設置爲轉換爲JSON字符串的字典。 **轉儲**只是轉換爲JSON字符串。它不是格式正確的flask.Response()對象。因此,如果您的視圖顯示「返回json.dumps(dict)」,那麼接收者將獲得一個常規的「content-type:text/html」響應,並將json.dumps輸出作爲負載。 – SamEsla