为什么 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 回复。
以下适用于 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 回复。