You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring WebClient如何提取嵌套在results字段下的SerieDetails对象列表

问题原因

你之前的写法错误原因是bodyToFlux仅适用于响应体本身为JSON数组的场景,而当前接口返回的是外层包裹了page、results字段的JSON对象,无法直接解析为SerieDetails的数据流,因此会解析失败。

解决方案

方案1:定义响应包装类(推荐,可读性和可维护性更高)

先定义一个和搜索接口响应结构匹配的POJO类:

// 如果使用Lombok,添加@Data注解可省略手动编写getter/setter
public class SearchSerieResponse {
    private Integer page;
    private List<SerieDetails> results;

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public List<SerieDetails> getResults() {
        return results;
    }

    public void setResults(List<SerieDetails> results) {
        this.results = results;
    }
}

修改findByQuery方法,先将响应转为包装类再提取results字段:

public List<SerieDetails> findByQuery(String query) {
    try {
        return this.webClient
                .get()
                .uri("/search/tv?api_key={apiKey}&language={lang}&query={query}", this.apiKey, this.lang, query)
                .retrieve()
                .bodyToMono(SearchSerieResponse.class)
                .map(SearchSerieResponse::getResults)
                .log()
                .block();
    } catch(Exception e ) {
        throw new RuntimeException("Can't reach the API");
    }
}

方案2:无需额外定义类,直接解析JSON节点

如果不想新增额外的POJO类,可以直接解析JSON节点提取results字段,需要用到Jackson的ObjectMapper:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

// Spring项目可以直接注入容器中自带的ObjectMapper实例
private final ObjectMapper objectMapper = new ObjectMapper();

public List<SerieDetails> findByQuery(String query) {
    try {
        return this.webClient
                .get()
                .uri("/search/tv?api_key={apiKey}&language={lang}&query={query}", this.apiKey, this.lang, query)
                .retrieve()
                .bodyToMono(JsonNode.class)
                .map(jsonNode -> objectMapper.convertValue(
                        jsonNode.get("results"),
                        new TypeReference<List<SerieDetails>>() {}
                ))
                .log()
                .block();
    } catch(Exception e ) {
        throw new RuntimeException("Can't reach the API");
    }
}

方案选择建议

如果该搜索接口会多次调用、后续可能需要用到page等其他外层字段,优先选择方案1;如果只是临时调用一次不想新增多余类,方案2即可满足需求。


内容的提问来源于stack exchange,提问作者iPPle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:24:05