2014-10-01 98 views
2

我正在嘗試使用Flask創建一個簡單的API。我現在想如下返回類型的字典列表:燒瓶jsonify返回奇怪的數組?

print results # prints out [{'date': '2014-09-25 19:00:00', 'title': u'Some Title'}] 
response = make_response(jsonify(results)) 
response.headers['Content-Type'] = 'application/json' 
return response 

但是,當我去的URL在瀏覽器中,我得到如下:

{ 
    "date": "title" 
} 

有誰知道我在做什麼這裏錯了嗎?歡迎所有提示!

回答

7

jsonify()將只接受字典。如果你給它一個列表,它會把對象變成一個字典,dict(argument)。見Flask.jsonify() documentation

創建Response與給定的參數與application/json MIME類型的JSON表示。 該函數的參數與dict構造函數相同。

(重點煤礦)

你的情況,你有一個元素的列表,而這個元素,當遍歷,有2個值。這兩個值,則成爲輸出詞典的鍵和值:

>>> results = [{'date': '2014-09-25 19:00:00', 'title': u'Some Title'}] 
>>> dict(results) 
{'date': 'title'} 

這是因爲dict()構造或者另需字典,關鍵字參數(key, value)雙的迭代。

的解決方案是不是在列表中通過,但給它,至少是一個關鍵:

response = jsonify(results=results) 

jsonify()已經返回響應的對象,沒有必要調用make_response()就可以了。以上產生一個帶有'results'鍵和您的列表作爲值的JSON對象。

jsonify()僅出於安全原因需要字典。再次引用文檔:

出於安全原因,只有對象支持頂層。欲瞭解更多信息,請看JSON Security

如果你真的想繞過這一點,你必須創建自己的迴應:

from Flask import json 

response = make_response(json.dumps(results), mimetype='application/json') 
+0

啊, 這就說得通了。但是如果我想提供一份清單而不是一本字典呢? API簡單地返回對象列表不是很常見嗎? – kramer65 2014-10-01 13:58:00

+0

@ kramer65:出於安全原因,API通常會將對象列表包裝在對象中。我已經更新了參考文獻的答案,以及如果您想忽略建議,如何解決此問題。 – 2014-10-01 14:01:58

+0

@ kramer65'import json; json.dumps(結果)',然後make_response – metaperture 2014-10-01 14:03:00

0

這應該不再是一個問題,現在瓶的jsonify()方法序列化的頂級陣列(如的this commit)。

您需要使用GitHub中的主分支,直到將新版本推送到包含此修補程序的Pypi。

爲了方便,你可以通過在Python列表:jsonify([1,2,3]) 或者通過一系列的argsjsonify(1,2,3)

兩個將被轉換爲:[1,2,3]

詳情點擊這裏:http://flask.pocoo.org/docs/dev/api/#flask.json.jsonify