RestTemplate處理巢狀的複雜返回物件

城裡的野山參發表於2021-03-11

文章將介紹使用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 協議》,轉載必須註明作者和本文連結
城裡的野山參

相關文章