Flask jsonify返回奇怪的数组?

时间:2014-10-01 13:52:35

标签: python json flask

我尝试使用Flask创建一个简单的API。我现在想要返回一个dicts列表,如下所示:

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

但是当我在浏览器中输入网址时,我会得到以下内容:

{
  "date": "title"
}

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

2 个答案:

答案 0 :(得分:8)

这只是Flask版本 0.11之前的问题;如果您仍然看到这个问题,最好的办法是升级到更高版本,因为0.10现在非常古老。


对于最高版本0.10的Flask,jsonify()只接受词典。如果你给它一个列表,它会把对象变成一个字典,dict(argument)。请参阅Flask.jsonify() documentation

  

使用Response mimetype的给定参数的JSON表示创建application/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')

答案 1 :(得分:1)

现在,Flask的jsonify()方法序列化顶级数组(从this commit开始),这不再是一个问题。

您需要使用Flask> = 0.11。

为方便起见,您可以传入Python列表:jsonify([1,2,3]) 或传递一系列argsjsonify(1,2,3)

两者都将转换为:[1,2,3]

详细信息:http://flask.pocoo.org/docs/dev/api/#flask.json.jsonify