如何在Flask中将列表转换为JSON格式?

110

目前Flask在将列表(JSONify)时会抛出错误。

我知道这可能是出于安全原因https://github.com/mitsuhiko/flask/issues/170,但我仍然希望有一种方法可以返回以下JSON列表:

[
    {'a': 1, 'b': 2},
    {'a': 5, 'b': 10}
]

取代

{ 'results': [
    {'a': 1, 'b': 2},
    {'a': 5, 'b': 10}
]}

当响应一个application/json请求时,我该如何使用Jsonify在Flask中返回一个JSON列表?


这不再是一个安全问题,但始终将返回一个字典视为最佳实践。:https://softwareengineering.stackexchange.com/a/304638/369319 - Noan Cloarec
8个回答

92

你不能这样做,但你仍然可以像这样做。我需要这个功能来使用jQuery-File-Upload插件。

import json
# get this object
from flask import Response

#example data:

    js = [ { "name" : filename, "size" : st.st_size , 
        "url" : url_for('show', filename=filename)} ]
#then do this
    return Response(json.dumps(js),  mimetype='application/json')

1
还有 flask.json.dumps,不知道这是否比 json.dumps 更好。 - Cameron White
3
flask.jsontry: import simplejson as json; except ImportError: import json 的简写形式。 - Ewan
6
+1 对于 mimetype='application/json',帮我省去了寻找相关标头的麻烦 :) - Shmil The Cat
有趣的是,我在完全相同的情况下(jQuery文件上传)也遇到了这个问题,而你的代码还帮助了我解决另一个问题。 - deweydb
我最喜欢这个答案。从我的经验来看,Response()make_response() 更简单地公开了 mimetype,而仅仅使用 return json.dumps() 不会设置任何头信息。 - sofly

64

3
这样做,我需要手动设置头部的 Content-Type 吗? - hllau
3
是的,application/json - FogleBird
24
@FogleBird,是哪方面的安全原因? - Jocelyn delalande
8
@Jocelyndelalande:http://flask.pocoo.org/docs/0.10/security/#json-security这个网页介绍了在使用Flask框架时如何安全地处理JSON数据,包括如何防止JSON劫持攻击和如何正确地限制JSON大小。为了保护应用程序的安全性,建议开发人员仔细阅读并严格遵循这些指南。 - David Röthlisberger
4
安全性不再是一个有效的问题,因此Flask的jsonify现在支持转储列表:https://dev59.com/wmcs5IYBdhLWcg3w-Yr4#35000418 - Jeff Widman
显示剩余2条评论

25

这对我有效。你使用的是哪个版本的Flask?

from flask import jsonify

...

@app.route('/test/json')
def test_json():
    list = [
            {'a': 1, 'b': 2},
            {'a': 5, 'b': 10}
           ]
    return jsonify(results = list)

4
我正在使用 Flask 0.9,但似乎输出的是哈希 JSON 而不是列表 JSON。 - hllau
7
不建议使用list作为变量标识符。 - TMOTTM

13

7

5

在Flask中,可以使用jsonify轻松将列表转换为JSON格式,例如:

from flask import Flask,jsonify
app = Flask(__name__)

tasks = [
    {
        'id':1,
        'task':'this is first task'
    },
    {
        'id':2,
        'task':'this is another task'
    }
]

@app.route('/app-name/api/v0.1/tasks',methods=['GET'])
def get_tasks():
    return jsonify({'tasks':tasks})  #will return the json

if(__name__ == '__main__'):
    app.run(debug = True)

jsonify({'tasks': tasks}) 工作得非常完美,这绝对为我节省了很多时间。 - A Star

1
josonify工作正常... 但是如果你只想传递一个没有'results'键的数组,你可以使用Python的JSON库。以下转换对我有效。
import json

@app.route('/test/json')
def test_json():
    mylist = [
        {'a': 1, 'b': 2},
        {'a': 5, 'b': 10}
        ]
    return json.dumps(mylist)

我认为这应该是被接受的答案,因为它是唯一返回正确数据结构的答案。非常感谢。 - G M

0
如果您正在搜索如何在Flask中返回JSON列表,并且您完全确定您的变量是一个列表,那么简单的方法是(其中bin是一个由1和0组成的列表):
   return jsonify({'ans':bin}), 201

最后,在您的客户端中,您将获得类似于以下内容:
{ "ans": [ 0.0, 0.0, 1.0, 1.0, 0.0 ] }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接