Android 端天气预报APP的实现(三)JSON解析天气数据

吕森
2023-12-01

上一章实现了天气预报API的获取,那么,今天就来讲讲获取后的数据如何解析吧~
相比大家可以看到,解析出来的数据是json格式的,那么我们需要使用json来解析天气数据。具体实现如下:
1. 首先获取的天气数据有实时天气、今日天气和未来天气,所以我先建了三个天气类,分别为WeatherBeanNow,WeatherBeanToday,WeatherBeanForecast:
1) WeatherBeanNow.java

package com.example.zhaoxin.myweatherforecast.Bean;

/**
 * Created by zhaoxin on 17/9/16.
 * 实时天气
 */

public class WeatherBeanNow {

    //地区
    private String mArea;
    //pm2.5
    private String mPm25;
    //天气质量状况
    private String mQuality;
    //实时温度
    private String mTemperature;
    //实时时间
    private String mTemperatureTime;
    //天气类型
    private String mWeather;
    //风向
    private String mWindDirection;
    //风力
    private String mWindPower;
    //湿度
    private String mSd;

    public WeatherBeanNow(String mArea, String mPm25, String mQuality, String mTemperature,
                          String mTemperatureTime, String mWeather,
                          String mWindDirection, String mWindPower, String mSd) {
        this.mArea = mArea;
        this.mPm25 = mPm25;
        this.mQuality = mQuality;
        this.mTemperature = mTemperature;
        this.mTemperatureTime = mTemperatureTime;
        this.mWeather = mWeather;
        this.mWindDirection = mWindDirection;
        this.mWindPower = mWindPower;
        this.mSd = mSd;
    }

    public String getmArea() {
        return mArea;
    }

    public void setmArea(String mArea) {
        this.mArea = mArea;
    }

    public String getmTemperature() {
        return mTemperature;
    }

    public void setmTemperature(String mTemperature) {
        this.mTemperature = mTemperature;
    }

    public String getmWeather() {
        return mWeather;
    }

    public void setmWeather(String mWeather) {
        this.mWeather = mWeather;
    }

    public String getmQuality() {
        return mQuality;
    }

    public void setmQuality(String mQuality) {
        this.mQuality = mQuality;
    }

    public String getmSd() {
        return mSd;
    }

    public void setmSd(String mSd) {
        this.mSd = mSd;
    }

    public String getmPm25() {
        return mPm25;
    }

    public void setmPm25(String mPm25) {
        this.mPm25 = mPm25;
    }

    public String getmWindDirection() {
        return mWindDirection;
    }

    public void setmWindDirection(String mWindDirection) {
        this.mWindDirection = mWindDirection;
    }

    public String getmWindPower() {
        return mWindPower;
    }

    public void setmWindPower(String mWindPower) {
        this.mWindPower = mWindPower;
    }

    public String getmTemperatureTime() {
        return mTemperatureTime;
    }

    public void setmTemperatureTime(String mTemperatureTime) {
        this.mTemperatureTime = mTemperatureTime;
    }
}

2) WeatherBeanToday.java

package com.example.zhaoxin.myweatherforecast.Bean;


/**
 * Created by zhaoxin on 17/9/5.
 */

public class WeatherBeanToday {

    //穿衣
    private String clothes;
    //晨练指数
    private String cl;
    //化妆指数
    private String beauty;
    //紫外线指数
    private String uv;
    //中暑指数
    private String zs;
    //约会指数
    private String yh;
    //夜生活指数
    private String nl;
    //紫外线
    private String ziWaiXian;

    public String getZiWaiXian() {
        return ziWaiXian;
    }

    public void setZiWaiXian(String ziWaiXian) {
        this.ziWaiXian = ziWaiXian;
    }

    public WeatherBeanToday(String clothes, String cl, String beauty, String uv, String zs, String yh, String nl, String ziWaiXian) {
        this.clothes = clothes;
        this.cl = cl;
        this.beauty = beauty;
        this.uv = uv;
        this.zs = zs;
        this.yh = yh;
        this.nl = nl;
        this.ziWaiXian = ziWaiXian;
    }

    public String getClothes() {
        return clothes;
    }

    public void setClothes(String clothes) {
        this.clothes = clothes;
    }

    public String getCl() {
        return cl;
    }

    public void setCl(String cl) {
        this.cl = cl;
    }

    public String getBeauty() {
        return beauty;
    }

    public void setBeauty(String beauty) {
        this.beauty = beauty;
    }

    public String getUv() {
        return uv;
    }

    public void setUv(String ziWaiXian) {
        this.uv = ziWaiXian;
    }

    public String getZs() {
        return zs;
    }

    public void setZs(String zs) {
        this.zs = zs;
    }

    public String getYh() {
        return yh;
    }

    public void setYh(String yh) {
        this.yh = yh;
    }

    public String getNl() {
        return nl;
    }

    public void setNl(String nl) {
        this.nl = nl;
    }
}

3) WeatherBeanForecast.java

package com.example.zhaoxin.myweatherforecast.Bean;

/**
 * Created by zhaoxin on 17/9/6.
 * 未来七日天气
 */

public class WeatherBeanForecast {

    //天气类型
    private String dayWeather;
    //日期
    private String day;
    //星期几
    private String weekDay;
    //晚间温度
    private String nightAirTemperature;
    //白天温度
    private String dayAirTemperature;
    //天气图片
    private String dayWeatherPic;


    public WeatherBeanForecast(String dayWeather, String day, String weekDay,
                               String nightAirTemperature, String dayAirTemperature, String dayWeatherPic) {

        this.dayWeather = dayWeather;
        this.day = day;
        this.weekDay = weekDay;
        this.nightAirTemperature = nightAirTemperature;

        this.dayAirTemperature = dayAirTemperature;
        this.dayWeatherPic = dayWeatherPic;
    }

    public String getDayWeather() {
        return dayWeather;
    }

    public void setDayWeather(String dayWeather) {
        this.dayWeather = dayWeather;
    }

    public String getDay() {
        return day;
    }

    public void setDay(String day) {
        this.day = day;
    }

    public String getWeekDay() {
        return weekDay;
    }

    public void setWeekDay(String weekDay) {
        this.weekDay = weekDay;
    }

    public String getNightAirTemperature() {
        return nightAirTemperature;
    }

    public void setNightAirTemperature(String nightAirTemperature) {
        this.nightAirTemperature = nightAirTemperature;
    }

    public String getDayAirTemperature() {
        return dayAirTemperature;
    }

    public void setDayAirTemperature(String dayAirTemperature) {
        this.dayAirTemperature = dayAirTemperature;
    }

    public String getDayWeatherPic() {
        return dayWeatherPic;
    }

    public void setDayWeatherPic(String dayWeatherPic) {
        this.dayWeatherPic = dayWeatherPic;
    }
}
  1. 有了这三个类,那么我们就可以开始解析了,加上上一篇写的获取数据的部分,代码如下:
package com.example.zhaoxin.myweatherforecast.utils;
/**
 * Created by zhaojing on 17/9/17.
 * 天气加载类,继承了AsyncTaskLoader,在loadInBackground()中完成网络数据的请求
 */
public class WeatherLoader extends AsyncTaskLoader<List<List>> {

    private List<WeatherBeanNow> mWeatherBeanNowList;
    private List<WeatherBeanToday> mWeatherBeanTodayList;
    private List<WeatherBeanForecast> mWeatherBeanForecastList;
    private List<List> mWeatherList;
    private String mCityName;
    private Context mContext;

    public WeatherLoader(Context context, String cityName) {
        super(context);

        this.mCityName = cityName;
        mWeatherBeanNowList = new ArrayList<>();
        mWeatherBeanTodayList = new ArrayList<>();
        mWeatherBeanForecastList = new ArrayList<>();
        mWeatherList = new ArrayList<>();
    }

    /**
     * 通过该方法启动加载
     */
    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Override
    protected void onStopLoading() {
        cancelLoad();
    }


    /**
     * 在子线程中完成网络数据请求
     * @return
     */
    @Override
    public List<List> loadInBackground() {

        final String host = "http://ali-weather.showapi.com";
        final String path = "/area-to-weather";
        final String method = "GET";
        String appcode = "c402356e77824e7d8a23eebf6cf6d0b5";
        final Map<String, String> headers = new HashMap<>();
        final Map<String, String> querys = new HashMap<>();

        headers.put("Authorization", "APPCODE " + appcode);
        querys.put("area", mCityName);
        querys.put("need3HourForcast", "0");
        querys.put("needAlarm", "0");
        querys.put("needHourData", "1");
        querys.put("needIndex", "1");
        querys.put("needMoreDay", "1");


        String content = "";

        HttpResponse response;
        try {

            response = HttpUtils.doGet(host, path, method, headers, querys);

            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "utf-8"));
            for (String s = reader.readLine(); s != null; s = reader.readLine()) {
                content += s;
            }
            Log.d("datadata_",content);

            //获得全部数据(json格式)
            JSONObject jsonObject = JSONObject.parseObject(content);
            JSONObject showApiResBody = (JSONObject) jsonObject.get("showapi_res_body");

            Log.d("data_", "all-->" + JSONObject.parseObject(content).toString());
            Log.d("data_", "f1-->" + showApiResBody.get("f1"));

            //解析实时数据
            if (jsonObject.get("showapi_res_code").equals(0)) {

                JSONObject jsonObjectNow = (JSONObject) showApiResBody.get("now");

                Log.d("data_", "jsonObjectNow-->" + jsonObjectNow.toString());

                String area = jsonObjectNow.getJSONObject("aqiDetail").get("area").toString();
                String pm25 = jsonObjectNow.getJSONObject("aqiDetail").get("pm2_5").toString();
                String quality = jsonObjectNow.getJSONObject("aqiDetail").get("quality").toString();

                String temperature = jsonObjectNow.get("temperature").toString();
                String temperatureTime = jsonObjectNow.get("temperature_time").toString();
                String weather = jsonObjectNow.get("weather").toString();
                String windDirection = jsonObjectNow.get("wind_direction").toString();
                String windPower = jsonObjectNow.get("wind_power").toString();
                String sd = jsonObjectNow.get("sd").toString();

                WeatherBeanNow weatherBeanNow = new WeatherBeanNow(area, pm25, quality, temperature,
                        temperatureTime, weather, windDirection, windPower, sd);

                mWeatherBeanNowList.add(weatherBeanNow);
                mWeatherList.add(mWeatherBeanNowList);
            } else {
                Log.d("thread_", "网络连接出错,请稍后重试");
                //Toast.makeText(mContext, "网络连接出错,请稍后重试", Toast.LENGTH_SHORT).show();
            }

            //解析今日天气
            if (jsonObject.get("showapi_res_code").equals(0)) {

                JSONObject jsonObjectToday = (JSONObject) showApiResBody.get("f1");
                JSONObject jsonObject1 = (JSONObject) jsonObjectToday.get("index");

                String clothes = jsonObject1.getJSONObject("clothes").get("desc").toString();
                String cl = jsonObject1.getJSONObject("cl").get("desc").toString();
                String beauty = jsonObject1.getJSONObject("beauty").get("desc").toString();
                String uv = jsonObject1.getJSONObject("uv").get("desc").toString();
                String zs = jsonObject1.getJSONObject("zs").get("desc").toString();
                String yh = jsonObject1.getJSONObject("yh").get("desc").toString();
                String nl = jsonObject1.getJSONObject("nl").get("desc").toString();
                String ziWaiXian = jsonObjectToday.get("ziwaixian").toString();

                WeatherBeanToday weatherBeanToday = new WeatherBeanToday(clothes, cl, beauty, uv, zs, yh, nl, ziWaiXian);

                mWeatherBeanTodayList.add(weatherBeanToday);
                mWeatherList.add(mWeatherBeanTodayList);
            } else {
                Log.d("thread_", "网络连接出错,请稍后重试");
                //Toast.makeText(mContext, "网络连接出错,请稍后重试", Toast.LENGTH_SHORT).show();
            }

            //解析未来七天天气
            if (jsonObject.get("showapi_res_code").equals(0)) {

                JSONObject jsonObjectForecast1 = (JSONObject) showApiResBody.get("f1");

                String dayWeather = jsonObjectForecast1.get("day_weather").toString();
                String day = jsonObjectForecast1.get("day").toString();
                String weekDay = jsonObjectForecast1.get("weekday").toString();
                String nightAirTemperature = jsonObjectForecast1.get("night_air_temperature").toString();
                String dayAirTemperature = jsonObjectForecast1.get("day_air_temperature").toString();
                String dayWeatherPic = jsonObjectForecast1.get("day_weather_pic").toString();

                WeatherBeanForecast weatherBeanForecast = new WeatherBeanForecast(dayWeather,
                        day, weekDay, nightAirTemperature, dayAirTemperature, dayWeatherPic);
                mWeatherBeanForecastList.add(weatherBeanForecast);

                JSONObject jsonObjectForecast2 = (JSONObject) showApiResBody.get("f2");

                dayWeather = jsonObjectForecast2.get("day_weather").toString();
                day = jsonObjectForecast2.get("day").toString();
                weekDay = jsonObjectForecast2.get("weekday").toString();
                nightAirTemperature = jsonObjectForecast2.get("night_air_temperature").toString();
                dayAirTemperature = jsonObjectForecast2.get("day_air_temperature").toString();
                dayWeatherPic = jsonObjectForecast2.get("day_weather_pic").toString();

                weatherBeanForecast = new WeatherBeanForecast(dayWeather,
                        day, weekDay, nightAirTemperature, dayAirTemperature, dayWeatherPic);
                mWeatherBeanForecastList.add(weatherBeanForecast);


                JSONObject jsonObjectForecast3 = (JSONObject) showApiResBody.get("f3");

                dayWeather = jsonObjectForecast3.get("day_weather").toString();
                day = jsonObjectForecast3.get("day").toString();
                weekDay = jsonObjectForecast3.get("weekday").toString();
                nightAirTemperature = jsonObjectForecast3.get("night_air_temperature").toString();
                dayAirTemperature = jsonObjectForecast3.get("day_air_temperature").toString();
                dayWeatherPic = jsonObjectForecast3.get("day_weather_pic").toString();

                weatherBeanForecast = new WeatherBeanForecast(dayWeather,
                        day, weekDay, nightAirTemperature, dayAirTemperature, dayWeatherPic);
                mWeatherBeanForecastList.add(weatherBeanForecast);


                JSONObject jsonObjectForecast4 = (JSONObject) showApiResBody.get("f4");

                dayWeather = jsonObjectForecast4.get("day_weather").toString();
                day = jsonObjectForecast4.get("day").toString();
                weekDay = jsonObjectForecast4.get("weekday").toString();
                nightAirTemperature = jsonObjectForecast4.get("night_air_temperature").toString();
                dayAirTemperature = jsonObjectForecast4.get("day_air_temperature").toString();
                dayWeatherPic = jsonObjectForecast4.get("day_weather_pic").toString();


                weatherBeanForecast = new WeatherBeanForecast(dayWeather,
                        day, weekDay, nightAirTemperature, dayAirTemperature, dayWeatherPic);
                mWeatherBeanForecastList.add(weatherBeanForecast);


                JSONObject jsonObjectForecast5 = (JSONObject) showApiResBody.get("f5");

                dayWeather = jsonObjectForecast5.get("day_weather").toString();
                day = jsonObjectForecast5.get("day").toString();
                weekDay = jsonObjectForecast5.get("weekday").toString();
                nightAirTemperature = jsonObjectForecast5.get("night_air_temperature").toString();
                dayAirTemperature = jsonObjectForecast5.get("day_air_temperature").toString();
                dayWeatherPic = jsonObjectForecast5.get("day_weather_pic").toString();


                weatherBeanForecast = new WeatherBeanForecast(dayWeather,
                        day, weekDay, nightAirTemperature, dayAirTemperature, dayWeatherPic);
                mWeatherBeanForecastList.add(weatherBeanForecast);


                JSONObject jsonObjectForecast6 = (JSONObject) showApiResBody.get("f6");

                dayWeather = jsonObjectForecast6.get("day_weather").toString();
                day = jsonObjectForecast6.get("day").toString();
                weekDay = jsonObjectForecast6.get("weekday").toString();
                nightAirTemperature = jsonObjectForecast6.get("night_air_temperature").toString();
                dayAirTemperature = jsonObjectForecast6.get("day_air_temperature").toString();
                dayWeatherPic = jsonObjectForecast6.get("day_weather_pic").toString();


                weatherBeanForecast = new WeatherBeanForecast(dayWeather,
                        day, weekDay, nightAirTemperature, dayAirTemperature, dayWeatherPic);
                mWeatherBeanForecastList.add(weatherBeanForecast);


                JSONObject jsonObjectForecast7 = (JSONObject) showApiResBody.get("f7");

                dayWeather = jsonObjectForecast7.get("day_weather").toString();
                day = jsonObjectForecast7.get("day").toString();
                weekDay = jsonObjectForecast7.get("weekday").toString();
                nightAirTemperature = jsonObjectForecast7.get("night_air_temperature").toString();
                dayAirTemperature = jsonObjectForecast7.get("day_air_temperature").toString();
                dayWeatherPic = jsonObjectForecast7.get("day_weather_pic").toString();


                weatherBeanForecast = new WeatherBeanForecast(dayWeather,
                        day, weekDay, nightAirTemperature, dayAirTemperature, dayWeatherPic);
                mWeatherBeanForecastList.add(weatherBeanForecast);


                mWeatherList.add(mWeatherBeanForecastList);

            } else {
                Toast.makeText(mContext, "网络连接出错,请稍后重试", Toast.LENGTH_SHORT).show();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return mWeatherList;
    }
}

至此,天气数据的解析就完成了。

 类似资料: