【问题标题】:Flask jsonify returns weird array?Flask jsonify 返回奇怪的数组?
【发布时间】:2014-11-26 09:25:42
【问题描述】:

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

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"
}

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

【问题讨论】:

    标签: python json flask


    【解决方案1】:

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


    对于 0.10 及以下版本的 Flask,jsonify() 将仅接受 字典。如果你给它一个列表,它会将对象变成一个字典,带有dict(argument)。见Flask.jsonify() documentation

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

    【讨论】:

    • 啊,有道理。但是如果我确实想提供一个列表而不是字典呢? API 简单地返回对象列表不是很常见吗?
    • @kramer65:出于安全原因,API 通常将对象列表包装在对象中。如果您想忽略这些建议,我已经用参考更新了答案以及如何解决这个问题。
    • @kramer65 import json; json.dumps(results),然后 make_response
    • 从 Flask 0.11 起不再适用
    • @JeffWidman:是的,所以这个问题不适用于最近 Flask 版本的任何人。我已经更新了答案以反映这一点。
    【解决方案2】:

    既然 Flask 的 jsonify() 方法会序列化顶级数组(截至 this commit),这应该不再是问题。

    您需要使用 Flask >= 0.11。

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

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

    详情请看:http://flask.pocoo.org/docs/dev/api/#flask.json.jsonify

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 2021-12-26
      • 2012-12-21
      • 2016-04-06
      • 2020-12-17
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      相关资源
      最近更新 更多