使用GSON解析複雜資料——天氣資訊
阿新 • • 發佈:2018-11-27
最近在做自己的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'
}
- GsonFormat外掛安裝使用教程(很簡單)
示 例
先展示下要解析的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格式的資料”);
在控制檯中可以看到解析出來的資料。