如何使用 Bottle 返回 JSON 数组?
Posted
技术标签:
【中文标题】如何使用 Bottle 返回 JSON 数组?【英文标题】:How do I return a JSON array with Bottle? 【发布时间】:2012-08-30 21:55:01 【问题描述】:我正在使用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 响应:
/single
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 数组?
【问题讨论】:
【参考方案1】:Bottle 的 JSON 插件只希望返回字典,而不是数组。存在与返回 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)
【讨论】:
谢谢,这是一篇有趣的文章。很高兴知道,如果我小心的话,我仍然可以做到这一点! 感谢一百万。 javascript,你到底为什么要这么做?谢谢你,这里是你的 +1 码瓶json响应的最正确方式。谢谢。【参考方案2】:根据 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"]
【讨论】:
以上是关于如何使用 Bottle 返回 JSON 数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP/Laravel 返回 Json 数据数组?
如何使用 Laravel response()->json() 返回空对象而不是空数组