1. 程式人生 > >Java工具類--JSON解析(以百度天氣為例)

Java工具類--JSON解析(以百度天氣為例)

隨著JSON的廣泛應用,解析JSON也成了程式設計師的一項基本技能。今天介紹JSON解析利器-Gson和fastjson

Gson是谷歌封裝的JSON解析類庫,使用方便,fastjson是阿里巴巴的產品,使用也非常方便,我問小滿喜歡用哪個?他說Gson,why?因為Gson單詞少,寫著方便!小滿,我覺得你說的很有道理。

  1. fromJson(String json, Class <T> classOfT)方法來實現從Json到java物件的轉換。
  2. toJson(Object src)方法實現物件轉化為JSON字串。

首先看一下fromJson方法

通常我們都會從網路中獲取資料,今天介紹一個獲取百度天氣的

http://api.map.baidu.com/telematics/v3/weather?location=CITY_NAME&output=json&ak=W69oaDTCfuGwzNwmtVvgWfGH

其中CITY_NAME就是城市名稱,通過這個就可以獲取到對應城市的天氣了。下面就來解析它。

首先看一下天氣的資料結構

這裡寫圖片描述
這裡寫圖片描述

下面我們分析一下這個資料結構,再根據資料結構定義好物件就Ok啦

根元素

這裡寫圖片描述

以下是我定義的根物件

public class WeatherInfo {
    private int error;
    private String status;
    private
String date; private List<WeatherResults> results; //省去setter和getter方法 }

再定義
List型的results

這裡寫圖片描述

public class WeatherResults {
    private String currentCity;
    private String pm25;
    private List<WeatherSuggest> index;
    private List<WeatherDay> weather_data;
    //省去setter和getter方法
}

在WeatherResults中再定義兩個List型的index和weather_data

這裡寫圖片描述

public class WeatherSuggest {
    private String title;
    private String zs;
    private String tipt;
    private String des;
    //省去setter和getter方法
}

public class WeatherDay {
    private String date;
    private String dayPictureUrl;
    private String nightPictureUrl;
    private String weather;
    private String wind;
    private String temperature;
    //省去setter和getter方法
}
        String city = URLEncoder.encode("北京", "UTF-8");
        String url = "http://api.map.baidu.com/telematics/v3/weather?location=CITY&output=json&ak=W69oaDTCfuGwzNwmtVvgWfGH".replace("CITY", city);
        //呼叫一個傳送http請求的方法,後面會有部落格寫如何傳送http請求
        //傳送請求後就得到了json字串
        String jsonStr = sendGet(url);
        //JSON的核心程式碼
        Gson gson = new GsonBuilder().create();
        WeatherInfo weatherInfo = gson.fromJson(jsonStr, WeatherInfo.class);
        //只需兩行程式碼,就完成了json字串到物件的對映
        //如果除去Gson gson = new GsonBuilder().create();只有一行程式碼,是不是很方便

使用fastjson的方法

    WeatherInfo weatherInfo = JSON.parseObject(jsonStr, WeatherInfo.class);//只需一行

有了物件,如果需要輸出其中的資料,就很簡單了。
假設要得到紫外線強度的des

    weatherInfo.getResults().get(0).getIndex().get(5).getDes()

得到資料

紫外線強度較弱,建議出門前塗擦SPF在12-15之間、PA+的防晒護膚品。

要得到天氣情況

    WeatherInfo weatherInfo = JSON.parseObject(jsonStr, WeatherInfo.class);
    List<WeatherDay> weatherDatas = weatherInfo.getResults().get(0).getWeather_data();
    System.out.println(weatherInfo.getResults().get(0).getCurrentCity());
        for(WeatherDay weatherDay:weatherDatas){
            System.out.print(weatherDay.getDate()+" ");
            System.out.print(weatherDay.getWeather());
            System.out.println(weatherDay.getTemperature());

        }

輸出結果

北京
週三 11月25日 (實時:-7℃) 晴-1 ~ -9℃
週四 晴轉多雲0 ~ -8℃
週五 多雲轉晴1 ~ -6℃
週六 多雲3 ~ -5℃

再看一下toJson方法

toJson方法更簡單,有了物件,直接呼叫toJson即可得到JSON字串

String json = gson.toJson(weatherInfo);

使用fastjson的方法

String json = JSON.toJSONString(weatherInfo);

使用fastjson會亂序,準確的說是fastjson對其進行了排序,而不是按照欄位的順序。