Jackson反序列化报错:LinkedHashMap无法转换为model.Artists
解决RestTemplate反序列化集合时的ClassCastException问题
这个问题我太熟悉了——本质是泛型擦除在RestTemplate反序列化时搞的鬼,根本不需要更换JSON数据获取方式,只要调整类型处理逻辑就能解决!
问题根源
当你用RestTemplate直接请求并接收ArrayList<Artists>时,Java的泛型在运行时会被擦除,RestTemplate无法识别集合中元素的具体类型,只能默认把JSON数组里的每个对象反序列化成LinkedHashMap(以键值对形式存储JSON字段)。这时候你试图把LinkedHashMap强转成model.Artists,自然就会抛出ClassCastException。
两种解决方案(推荐第一种)
方案1:获取数据时明确泛型类型(从源头解决)
使用ParameterizedTypeReference来告诉RestTemplate集合的具体泛型类型,这样它就能直接把JSON反序列化成List<Artists>,后续过滤无需额外转换:
RestTemplate restTemplate = new RestTemplate(); String apiUrl = "你的目标JSON接口地址"; // 用ParameterizedTypeReference指定List<Artists>的类型 ParameterizedTypeReference<List<Artists>> typeReference = new ParameterizedTypeReference<List<Artists>>() {}; ResponseEntity<List<Artists>> response = restTemplate.exchange(apiUrl, HttpMethod.GET, null, typeReference); // 直接拿到正确类型的列表,过滤操作毫无压力 List<Artists> allArtists = response.getBody(); List<Artists> filteredArtists = allArtists.stream() .filter(artist -> /* 你的过滤条件,比如artist.getPopularity() > 80 */) .collect(Collectors.toList());
方案2:手动将LinkedHashMap转换为Artists实例(适配已有的数据)
如果你已经拿到了List<LinkedHashMap>,可以借助Jackson的ObjectMapper把每个Map对象转成Artists实例(你的项目已经引入Jackson依赖,因为实体类用了@JsonIgnore注解):
// 假设你已获取到rawList = restTemplate.getForObject(apiUrl, ArrayList.class); ObjectMapper objectMapper = new ObjectMapper(); List<Artists> allArtists = new ArrayList<>(); for (LinkedHashMap<String, Object> artistMap : rawList) { // 把LinkedHashMap转成Artists实例 Artists artist = objectMapper.convertValue(artistMap, Artists.class); allArtists.add(artist); } // 现在可以正常过滤了 List<Artists> filteredArtists = allArtists.stream() .filter(...) .collect(Collectors.toList());
额外注意事项
- 确保你的
Artists实体类有无参构造方法(Jackson反序列化必须); - 如果JSON字段名和实体类字段名不匹配,记得用
@JsonProperty注解映射,比如@JsonProperty("artist_name") private String name;; - 优先选择方案1,它更简洁且避免了额外的转换开销。
内容的提问来源于stack exchange,提问作者OanaV.
相关产品推荐
相关产品推荐

