如何使用Bottle返回JSON数组?

时间:2012-09-06 06:13:41

标签: python bottle

我正在使用Bottle编写一个API,到目前为止一直很棒。但是,在尝试返回JSON数组时,我遇到了一个小障碍。这是我的测试应用代码:

from bottle import route, run

@route('/single')
def returnsingle():
    return { "id": 1, "name": "Test Item 1" }

@route('/containsarray')
def returncontainsarray():
    return { "items": [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }] }

@route('/array')
def returnarray():
    return [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }]

run(host='localhost', port=8080, debug=True, reloader=True)

当我运行并请求每条路线时,我得到了前两条路线所期望的JSON响应:

/单

{ id: 1, name: "Test Item 1" }

/ containsarray

{ "items": [ { "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" } ] }

所以,我原本期望返回一个字典列表来创建以下JSON响应:

[ { "id": 1, "name": "Test Object 1" }, { "id": 2, "name": "Test Object 2" } ]

但是请求/array路由只会导致错误。我做错了什么,如何以这种方式返回JSON数组?

2 个答案:

答案 0 :(得分:71)

Bottle的JSON插件只需要返回dicts而不是数组。返回JSON数组存在漏洞 - 例如参见this post about JSON hijacking

如果你真的需要这样做,可以做到,例如

@route('/array')
def returnarray():
    from bottle import response
    from json import dumps
    rv = [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }]
    response.content_type = 'application/json'
    return dumps(rv)

答案 1 :(得分:9)

根据Bottle的0.12文件:

  

如上所述,Python字典(或其子类)是   自动转换为JSON字符串并返回到   将Content-Type标头设置为application / json的浏览器。这个   使得实现基于json的API变得容易。除以外的数据格式   json也受到支持。请参阅tutorial-output-filter了解更多信息。

这意味着您不需要import json也不需要设置响应的content_type属性。

因此,代码大大减少了:

@route('/array')
def returnarray():
    rv = [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }]
    return dict(data=rv)

Web服务器返回的JSON文档如下所示:

{"data": [{"id": 1, "name": "Test Item 1"}, {"id": 2, "name": "Test Item 2"}]}