1. 程式人生 > >使用GSON解析複雜資料——天氣資訊

使用GSON解析複雜資料——天氣資訊

最近在做自己的App時,要在主介面上新增簡單的天氣資訊顯示,然後就理所當然的跑到百度查詢如何才能獲取到天氣資訊,最後決定採用第三方天氣資訊服務商提供的資料,在看第三方提供的API說明時發現,獲取到的天氣資料是Json格式的,需要自己解析。又是經過一番百度,最後確定使用Google提供的Gson庫來解析Json資料。

這裡不講為什麼,只通過一個例子展現Gson解析Json資料的過程。

使用的編輯器為Android Studio,首先給自己的項新增Gson庫,並且給Android Studio安裝GsonFormat外掛。

  • Gson新增方法,To use Gson in Android。
dependencies {
    compile 'com.google.code.gson:gson:2.8.2'
}

示 例

先展示下要解析的Json資料:

這個Json資料總共分為三層
 - 第一層:error / status / date / results
 - 第二層:results中又分為 currentCity / weather_data
 - 第三層:weather_data中又分為 date / weather / wind / temperature

具體資料如下:
{
    "error"
: 0, "status": "success", "date": "2017-11-25", "results": [ { "currentCity": "杭州", "weather_data": [ { "date": "週六(今天, 實時:19℃)", "weather": "大雨", "wind": "東南風5-6級", "temperature"
: "18℃" }, { "date": "週日", "weather": "陣雨轉多雲", "wind": "西北風4-5級", "temperature": "21 ~ 14℃" } ] } ] }

在專案中新建一個類Test_Weather.java,這裡直接使用GsonFormat外掛生成程式碼,如下:

package com.************.server.MyClass;

import java.util.List;

public class Test_Weather {

    /**
     * error : 0
     * status : success
     * date : 2017-11-25
     * results : [{"currentCity":"杭州","weather_data":[{"date":"週六(今天, 實時:19℃)","weather":"大雨","wind":"東南風5-6級","temperature":"18℃"},{"date":"週日","weather":"陣雨轉多雲","wind":"西北風4-5級","temperature":"21 ~ 14℃"}]}]
     */

    private int error;
    private String status;
    private String date;
    private List<ResultsBean> results;

    public int getError() {
        return error;
    }

    public void setError(int error) {
        this.error = error;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public List<ResultsBean> getResults() {
        return results;
    }

    public void setResults(List<ResultsBean> results) {
        this.results = results;
    }

    public static class ResultsBean {
        /**
         * currentCity : 杭州
         * weather_data : [{"date":"週六(今天, 實時:19℃)","weather":"大雨","wind":"東南風5-6級","temperature":"18℃"},{"date":"週日","weather":"陣雨轉多雲","wind":"西北風4-5級","temperature":"21 ~ 14℃"}]
         */

        private String currentCity;
        private List<WeatherDataBean> weather_data;

        public String getCurrentCity() {
            return currentCity;
        }

        public void setCurrentCity(String currentCity) {
            this.currentCity = currentCity;
        }

        public List<WeatherDataBean> getWeather_data() {
            return weather_data;
        }

        public void setWeather_data(List<WeatherDataBean> weather_data) {
            this.weather_data = weather_data;
        }

        public static class WeatherDataBean {
            /**
             * date : 週六(今天, 實時:19℃)
             * weather : 大雨
             * wind : 東南風5-6級
             * temperature : 18℃
             */

            private String date;
            private String weather;
            private String wind;
            private String temperature;

            public String getDate() {
                return date;
            }

            public void setDate(String date) {
                this.date = date;
            }

            public String getWeather() {
                return weather;
            }

            public void setWeather(String weather) {
                this.weather = weather;
            }

            public String getWind() {
                return wind;
            }

            public void setWind(String wind) {
                this.wind = wind;
            }

            public String getTemperature() {
                return temperature;
            }

            public void setTemperature(String temperature) {
                this.temperature = temperature;
            }
        }
    }

}

然後準備使用Gson解析,前面準備的天氣資訊。這裡是在Activity中使用的。

 private void parseJsonWithGson_demo(String jsonData) {

        // 初始化GSON
        Gson gson = new Gson();

        // 使用Gson提供的fromJson將String格式的Json資料轉為物件
        Test_Weather weather = gson.fromJson(jsonData, Test_Weather.class);

        // 解析出第一層的資料
        Log.d("Tag", "error: " + weather.getError());
        Log.d("Tag", "status: " + weather.getStatus());
        Log.d("Tag", "date: " + weather.getDate());

        // 解析"results":[]中的第二層資料,因為是陣列,獲取的物件要用用List<>宣告
        List<Test_Weather.ResultsBean> results = weather.getResults();

        // 遍歷"results":[]中的所有元素
        for (Test_Weather.ResultsBean res : results) {

            // 直接獲取第二層資料
            Log.d("Tag", "CurrentCity: " + res.getCurrentCity());

            // 解析"weather_data":[]中的第三層資料,因為是陣列,獲取的物件要用用List<>宣告
            List<Test_Weather.ResultsBean.WeatherDataBean> weatherDataBeans = res.getWeather_data();

            // 遍歷"weather_data":[]中的所有元素
            for (Test_Weather.ResultsBean.WeatherDataBean wea : weatherDataBeans) {

                // 直接獲取第三層資料
                Log.d("Tag", "date: " + wea.getDate());
                Log.d("Tag", "weather: " + wea.getWeather());
                Log.d("Tag", "wind: " + wea.getWind());
                Log.d("Tag", "temperature: " + wea.getTemperature());
            }
        }
    }

找個地方呼叫方法 parseJsonWithGson(“這裡傳入上面給出的Json格式的資料”);
在控制檯中可以看到解析出來的資料。