我有以下JSON响应:
{
"Count": 1,
"Products": [
{
"ProductID": 3423
},
{
"ProductID": 4321
}
]
}
我希望能够使用WebClient从Products数组中返回“产品”列表,而不必使用“ ArrayList products”字段创建单独的Dto类。
我用了这样的东西
webClient.get()
.uri(uriBuilder -> uriBuilder
.path(URI_PRODUCTS)
.build())
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToFlux(Product.class)
.collectList();
它检索其中包含一个Product的列表,但所有值都为null。我能够使其与DTO响应一起使用,例如
...retrieve().bodyToMono(ProductResponse.class).block();
其中ProductResponse中具有产品列表。但是我试图避免不得不创建额外的类。有没有办法像使用jsonPath(类似于WebTestClient)那样拉字段?
答案 0 :(得分:1)
在retrieve()
之后,您可以始终.map
将结果转换为相应的类型。借助JsonNode
path()
实例方法,您可以类似于WebTestClient
jsonPath()
webClient.get()
.uri(uriBuilder -> uriBuilder
.path(URI_PRODUCTS)
.build())
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(JsonNode.class)
.map(s-> s.path("Products"))
.map(s->{
try {
return mapper.readValue(s.traverse(), new TypeReference<List<Product>>() {} );
} catch (IOException e) {
e.printStackTrace();
return new ArrayList<Product>();
}
})
.block();