我正在使用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数组?
答案 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"}]}