我正在尝试从基于Quarkus的Rest API提供JSON响应,我发现即使我提供具有正确JSON的响应,我的响应中也会得到额外的数组包装器。有没有办法防止在JSON周围添加数组包装器?
以下是用于GET请求的Quarkus Rest API:
@Path("/testData")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Multi <String> test() throws IOException {
return Multi.createFrom().items(IOUtils.toString(getClass().getResourceAsStream("/TestJSON.json"), StandardCharsets.UTF_8));
}
以下是我的TestJSON.json文件内容:
{
"isA": "customerDocument",
"createdOn": "2022-10-10T12:29:43",
"customerBody": {
"customerList": [
{
"name": "Batman",
"age": 45,
"city": "gotham"
}
]
}
}
当我编译程序并通过Swagger UI获得响应时,我会得到这样的响应:
[
{
"isA": "customerDocument",
"createdOn": "2022-10-10T12:29:43",
"customerBody": {
"customerList": [
{
"name": "Batman",
"age": 45,
"city": "gotham"
}
]
}
}
]
正如我们所看到的,一个额外的外部包装被添加到响应中,而我没有提供。有人能告诉我这里出了什么问题,并提供一些建议来避免添加包装器数组吗?
我偶然发现了与您完全相同的问题。我找到的解决方案是用对方法进行注释
@Stream(Stream.MODE.RAW)
根据文件:
@Stream(Stream.MODE.RAW(:在这种情况下,每个值都会在可用时直接写入导线,不需要任何格式。这对于可以分割的值最有用,例如字符串、字节、缓冲区等,然后在客户端重新连接。
该页面还解释了您和我遇到的不希望的行为:
资源方法上的No@Stream注释:Resteasy将收集每个值,直到流完成,然后将它们封装到java.util.List实体中并发送到客户端。
因此,如果我正确理解以上内容,注释不仅会更改响应的格式,而且会更改"反应性";,即,是等待整个Multi
完成生成值,然后批量发送,还是逐项发送,这可能是另一个重要的考虑因素。