RestTemplate处理嵌套的复杂返回对象
文章将介绍使用RestTempalte
请求接口,如何处理复杂的返回对象(存在对象嵌套)。
以腾讯位置服务逆地址解析为例进行演示,通过代码说明如何处理复杂的返回对象)。
如下图
整个响应结果可视为一个对象,其中包含了result
对象,result
又包含了另外的对象,对于这样的返回值,该如何进行获取并使用?
这里将使用到java内部类
概念,内部类的说明网上也有很多资料,这里不做额外的说明。
请求代码如下
RestTemplate http=new RestTemplate();
Result1 result=http.getForObject("https://apis.map.qq.com/ws/geocoder/v1/?location=39.984154,116.307490&key=this_is_your_key&get_poi=1",Result1.class);
重点是Result1.class
如何编写。
... //头部引入,省略
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result1 {
private Integer status;
private String message;
private String request_id;
private Result result;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result{
private String address;
private FormattedAddress formatted_address;
@Data
@NoArgsConstructor
@AllArgsConstructor
class FormattedAddress{
private String recommend;
private String rough;
}
private AddressComponent address_component;
@Data
@NoArgsConstructor
@AllArgsConstructor
class AddressComponent{
private String nation;
private String province;
private String city;
private String district;
private String street;
private String street_number;
}
}
}
这样书写,使用RestTemplate.getForObject
就可以帮助我们将返回值转换成对应的POJO
Result1.class
类型的对象并完成赋值动作,需要注意这里使用了lombok
来简化代码,其作用是帮助生成getter
,setter
以及构造器方法,更多资料可自行百度。
注意点
内部类在定义时如果不显式声明为public
,无法通过外部类的对象来读取其中的值。
如下图
...
public class Result{
private String address;
private FormattedAddress formatted_address;
@Data
@NoArgsConstructor
@AllArgsConstructor
class FormattedAddress{
private String recommend;
private String rough;
}
}
...
其中Result
加了public
标识,而FormattedAddress
没有,这样当我们进行如下调用时
RestTemplate http=new RestTemplate();
Result1 result=http.getForObject("https://apis.map.qq.com/ws/geocoder/v1/?location=39.984154,116.307490&key=this_is_your_key&get_poi=1",Result1.class);
System.out.println(result.getResult()); //能够访问
System.out.println(result.getResult().getFormatted_address().getRecommend()); //报错
本作品采用《CC 协议》,转载必须注明作者和本文链接
如果 Result 中的 AddressComponent 是个列表的话该怎么在一个定义呢