如何使用SpringWebClient按名称获取json字段?

如何使用SpringWebClient按名称获取json字段?,json,spring,response,webclient,project-reactor,Json,Spring,Response,Webclient,Project Reactor,我有以下JSON响应: { "Count": 1, "Products": [ { "ProductID": 3423 }, { "ProductID": 4321 } ] } 我希望能够使用WebClient从产品阵列返回“产品”列表,而无需使用字段“ArrayList Products”创建单独的Dto类 我用过这样的东西 webClien

我有以下JSON响应:

{
    "Count": 1,
    "Products": [
        {
            "ProductID": 3423
        },
        {
            "ProductID": 4321
        }
    ]
}
我希望能够使用WebClient从产品阵列返回“产品”列表,而无需使用字段“ArrayList Products”创建单独的Dto类

我用过这样的东西

        webClient.get()
                .uri(uriBuilder -> uriBuilder
                .path(URI_PRODUCTS)
                .build())
                .accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .bodyToFlux(Product.class)
                .collectList();
它检索一个列表,其中包含一个产品,但所有值均为空。我能够让它与DTO响应一起工作,例如

...retrieve().bodyToMono(ProductResponse.class).block();
其中ProductResponse包含产品列表。但是我试图避免创建额外的类。是否有类似于使用jsonPath(类似于WebTestClient)的方法拉取字段?

检索()之后
您可以始终
。将结果映射到相应的类型。在
JsonNode
path()
实例方法的帮助下,您可以像
WebTestClient
jsonPath()

webClient.get()
.uri(uriBuilder->uriBuilder
.path(URI_产品)
.build())
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodytomino(JsonNode.class)
.map(s->s.path(“产品”))
.map(s->{
试一试{
返回mapper.readValue(s.traverse(),new TypeReference(){});
}捕获(IOE异常){
e、 printStackTrace();
返回新的ArrayList();
}
})
.block();

我最终创建了一个“ProductDto”,但我使用了您的方法,它解决了我遇到的另一个问题!非常感谢。
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();