为什么 web2py json 服务不能正确处理列表?

Why don't web2py json services treat lists properly?

以下适用于 json,其最外层容器是像 { ... }

这样的对象
@service.json
def index():
    data = request.vars
    #fields are now accessible via data["fieldname"] or data.fieldname
    #processing must be done to turn Storage object into dict()
    return data_as_dict

但是,如果您 post 列表,则它不起作用

POST:

[
    {"test": 1}
]

data 将是一个空存储对象,data[0] 将是 None

解决方法很简单:

@service.json      #so output is still returned as json
def index():
    data = json.loads(request.body.read())
    return data

data 现在在对象样式 JSON 的情况下是一个字典(在我看来比存储对象更容易使用),而在 JSON 是一个列表时是一个本地列表。

我的问题是为什么这不是默认行为?为什么 JSON 服务不接受有效的 JSON?

@service.json 装饰器简单地注册了一个函数,因此可以通过 returns 一个 Service 对象的控制器访问它。装饰器确保服务控制器在调用装饰函数时returns一个JSON响应,但它对JSON[的处理不做任何事情=31=]输入.

无论如何,您的问题不在于 @service.json 装饰器,而在于对 request.vars 的误解。 request.vars 是一个类似字典的对象,由查询字符串中的键和值填充 and/or 请求正文(如果请求正文包含表单变量或 JSON 键和值对象).它不打算简单地成为请求正文中 posted 的任何任意数据结构的副本。因此,如果您在请求正文中 post 一个 JSON 数组,则将该数组复制到 request.vars 是没有意义的,因为它不是合适的数据结构类型。如果你想 post 一个 JSON 数组,正确的处理方法是读取请求正文,就像你所做的那样。

此外,请注意,因为您的 index 函数不接受任何参数,因此不会利用 @service 装饰器将参数从 HTTP 请求映射到函数参数的能力,您可以通过放弃 @service 装饰器并更直接地访问 index 函数来简化您的代码:

def index():
    data = json.loads(request.body.read())
    return data

假设 index 在 default.py 控制器中,您可以 post JSON 到 /yourapp/default/index.json (注意 .json 扩展名),你会得到 JSON 回复。