如何用Rest Template将根数组JSON自动绑定至含List的SpaceX POJO
解决RestTemplate将JSON数组自动绑定到SpaceX类的List属性问题
我懂你想要的效果——不用手动把数组塞进SpaceX对象,让RestTemplate一步到位把返回的JSON数组自动绑定到SpaceX的List
首先先确认下你的类结构大概是这样的(方便后续理解):
public class SpaceX { private List<Rocket> rockets; // getter、setter 省略 } public class Rocket { @JsonProperty("Rocket ID") private String rocketId; @JsonProperty("name") private String name; // getter、setter 省略 }
问题核心在于:接口返回的JSON是数组形式(比如 [{"Rocket ID":"falcon1", "name":"Falcon 1"}, ...]),而RestTemplate默认会把数组映射成List<Rocket>,但你想要直接映射成SpaceX对象,让它的rockets属性自动填充这个数组。
方案1:用ParameterizedTypeReference获取列表后手动赋值(简单直接)
这是最容易上手的方式,代码清晰易懂,只需要多一步手动赋值:
RestTemplate restTemplate = new RestTemplate(); // 用ParameterizedTypeReference指定要反序列化的类型为List<Rocket> ParameterizedTypeReference<List<Rocket>> typeRef = new ParameterizedTypeReference<List<Rocket>>() {}; ResponseEntity<List<Rocket>> response = restTemplate.exchange( "你的API请求地址", HttpMethod.GET, null, typeRef ); // 创建SpaceX对象并自动填充属性 SpaceX spaceX = new SpaceX(); spaceX.setRockets(response.getBody());
方案2:自定义Jackson反序列化器,完全自动映射
如果你想彻底跳过手动赋值,让RestTemplate直接返回SpaceX对象,可以给SpaceX类自定义一个反序列化器:
第一步:编写自定义反序列化器
public class SpaceXDeserializer extends StdDeserializer<SpaceX> { protected SpaceXDeserializer() { super(SpaceX.class); } @Override public SpaceX deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 把JSON数组直接解析成List<Rocket> List<Rocket> rockets = p.readValueAs(new TypeReference<List<Rocket>>() {}); SpaceX spaceX = new SpaceX(); spaceX.setRockets(rockets); return spaceX; } }
第二步:给SpaceX类标注使用该反序列化器
@JsonDeserialize(using = SpaceXDeserializer.class) public class SpaceX { private List<Rocket> rockets; // getter、setter 省略 }
第三步:直接获取SpaceX对象
RestTemplate restTemplate = new RestTemplate(); SpaceX spaceX = restTemplate.getForObject("你的API请求地址", SpaceX.class);
方案3:添加@JsonCreator构造器(轻量简洁)
这是最简洁的方式,只需要给SpaceX类加一个带List参数的构造器,并用@JsonCreator标注,让Jackson知道用这个构造器来解析数组:
public class SpaceX { private List<Rocket> rockets; @JsonCreator public SpaceX(List<Rocket> rockets) { this.rockets = rockets; } // getter、setter 省略 }
之后你就可以直接用RestTemplate获取SpaceX对象了,Jackson会自动把JSON数组作为参数传入构造器,完成属性填充:
RestTemplate restTemplate = new RestTemplate(); SpaceX spaceX = restTemplate.getForObject("你的API请求地址", SpaceX.class);
内容的提问来源于stack exchange,提问作者Bennett Dams
相关产品推荐
相关产品推荐

