Springboot使用RestTemplate调用外部API结果无法反序列化为Post数组求助
错误根因
接口返回的JSON根节点是对象类型(以{开头),但你直接指定反序列化目标为Post[]数组类型,Jackson无法将对象映射为数组,因此抛出类型不匹配异常。从你提供的示例JSON也能看出,你需要的Post列表是嵌套在根对象的posts字段中的,并非直接作为根节点返回。
解决方案
方案1:新增外层响应包装类(推荐)
新增一个包装类接收外层对象,再从包装类中取出Post数组:
- 定义包装类
PostResponse
public class PostResponse { private Post[] posts; // 必须添加无参构造、getter、setter供Jackson反序列化使用 public PostResponse() {} public Post[] getPosts() { return posts; } public void setPosts(Post[] posts) { this.posts = posts; } }
- 修改Service层调用代码
ResponseEntity<PostResponse> responseEntity = restTemplate.getForEntity(url, PostResponse.class, tagName); Post[] posts = responseEntity.getBody().getPosts();
方案2:无需新增类,直接解析JSON节点
如果你不想额外创建包装类,可以先拿到根JSON节点,再提取posts字段做转换:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; // 先以JsonNode类型接收整个响应 ResponseEntity<JsonNode> responseEntity = restTemplate.getForEntity(url, JsonNode.class, tagName); JsonNode rootNode = responseEntity.getBody(); JsonNode postsNode = rootNode.get("posts"); // 将posts节点转换为Post数组 ObjectMapper objectMapper = new ObjectMapper(); Post[] posts = objectMapper.treeToValue(postsNode, Post[].class);
注意事项
- 确保
Post类提供无参构造方法,以及所有字段对应的getter、setter方法 - 你当前
Post类中tags字段的@JsonFormat注解配置是正确的,支持单字符串转数组的场景
内容的提问来源于stack exchange,提问作者kiki
相关产品推荐
相关产品推荐

