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 协议》,转载必须注明作者和本文链接
城里的野山参
讨论数量: 1

如果 Result 中的 AddressComponent 是个列表的话该怎么在一个定义呢

4个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!