烧瓶jsonify返回奇怪的数组?

问题描述:

我正在尝试使用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" 
} 

有谁知道我在做什么这里错了吗?欢迎所有提示!

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

这应该不再是一个问题,现在瓶的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