以下适用于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?
答案 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响应。