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

Springboot使用RestTemplate调用外部API结果无法反序列化为Post数组求助

错误根因

接口返回的JSON根节点是对象类型(以{开头),但你直接指定反序列化目标为Post[]数组类型,Jackson无法将对象映射为数组,因此抛出类型不匹配异常。从你提供的示例JSON也能看出,你需要的Post列表是嵌套在根对象的posts字段中的,并非直接作为根节点返回。

解决方案

方案1:新增外层响应包装类(推荐)

新增一个包装类接收外层对象,再从包装类中取出Post数组:

  1. 定义包装类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;
    }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:15:05