为什么web2py json服务没有正确处理列表?

时间:2016-11-14 23:23:04

标签: python json list web2py

以下适用于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:

[
    {"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(比存储对象imo更容易使用)和JSON是列表时的本机列表的情况下的字典。

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

1 个答案:

答案 0 :(得分:0)

@ service.json装饰器只是注册一个函数,因此可以通过一个返回import org.springframework.data.repository.CrudRepository; import java.util.UUID; public interface TestRepository extends CrudRepository<Test, UUID> { } 对象的控制器来访问它。装饰器确保服务控制器在调用修饰函数时返回JSON 响应,但它对JSON 输入的处理没有任何作用。

在任何情况下,您的问题都不在于Service装饰者,而在于对@service.json的误解。 request.vars是一个类似字典的对象,用查询字符串和/或请求体中的键和值填充(如果请求体包含表单变量或键和值的JSON对象)。它不是简单地是在请求主体中发布的任何任意数据结构的副本。因此,如果您在请求正文中发布JSON数组,那么将该数组复制到request.vars是没有意义的,因为它不是适当类型的数据结构。如果你想发布一个JSON数组,处理它的正确方法就是像你一样读取请求体。

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

index

假设def index(): data = json.loads(request.body.read()) return data 位于default.py控制器中,您可以将JSON发布到index(请注意/yourapp/default/index.json扩展名),然后您将收到JSON响应。