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
相关产品推荐
相关产品推荐

