如何使用 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章

在python中模拟bottle.request对象

如何使用 PHP/Laravel 返回 Json 数据数组?

如何检查json返回值是数组还是字典的形式

如何使用 Laravel response()->json() 返回空对象而不是空数组

如何通过 PyMongo 和 Bottle 显示来自 MongoDB 数据库的图像?

如何使用两个数组创建一个json数据并将其返回给ajax