Java工具類--JSON解析(以百度天氣為例)
阿新 • • 發佈:2019-01-07
隨著JSON的廣泛應用,解析JSON也成了程式設計師的一項基本技能。今天介紹JSON解析利器-Gson和fastjson
Gson是谷歌封裝的JSON解析類庫,使用方便,fastjson是阿里巴巴的產品,使用也非常方便,我問小滿喜歡用哪個?他說Gson,why?因為Gson單詞少,寫著方便!小滿,我覺得你說的很有道理。
- fromJson(String json, Class <T> classOfT)方法來實現從Json到java物件的轉換。
- 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對其進行了排序,而不是按照欄位的順序。