如何使用Spring WebClient通过名称获取json字段?

时间:2019-02-12 22:14:27

标签: json spring response webclient project-reactor

我有以下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)那样拉字段?

1 个答案:

答案 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();