如何使用GSON解析JSON數據
GSON是谷歌提供的一個開源庫,可以用來解析JSON數據
添加依賴
不過GSON並沒有被添加到Android官方的API中,所以如果要使用這個開源庫,我們就要先添加依賴,編輯app/build.gradle文件,
在dependencies閉包中添加如下內容:
implementation 'com.google.code.gson:gson:2.7'
JSON數據介紹
JSON數據分為兩種,對象和數組,用{ }括起來的是對象,用[ ]括起來的是數組。
對象:
{ "user": "user1", "pwd": "123456" }
此處是一個JSON對象,裡面有兩個字段,分別是user和pwd。
數組:
[ {"user": "user1", "pwd": "123456"}, {"user": "user2", "pwd": "123456"} ]
此處是一個JSON數組,數組裡面包含兩個對象,每個對象包含兩個字段。
字段和數組
{ "user": "user1", "pwd": "123456", "jsonArray": [ {"user": "user1", "pwd": "123456"}, {"user": "user2", "pwd": "123456"} ], "result": "成功" }
此處是一個JSON對象,裡面包含瞭字段和數組。
在實際情況中,一般都是一個JSON對象裡面有數組和其它字段,或者是很多的嵌套,我們隻需要一層一層的去解析就可以瞭。
GsonFormat
Gson是采用對象映射的方式,所以我們要為JSON數據創建一個Java對象來與之對應。
我們可以使用GsonFormat插件,迅速的將JSON數據轉換成Java對象,使用方法如下:
1、安裝好GsonFormat插件
2、新建一個類,在類裡的空白處按Alt+S鍵,並將要轉換的JSON數據復制進去,界面如下所示:
註意:自動生成的時候,內部類可能會是靜態的,手動把內部類的static去掉。
@SerializedName註解
由於JSON中的一些字段可能不太適合直接作為Java字段來命名,因此這裡使用瞭@SerializedName註解的方式來讓JSON字段和Java字段之間建立映射關系。
例:
此處的Test類為JSON數據的一個映射類,而USER和PWD為JSON數據中的兩個字段,很明顯,這兩個字段的名字不適合做變量名,所以使用@SerializedName註解的方式來讓USER和user建立映射關系,PWD和password建立映射關系。
Gson的使用
解析JSON對象
Gson gson = new Gson(); User user = gson.fromJson(jsonData, User.class);
此處的User類是JSON數據的一個映射類,jsonData是JSON數據,註意:此處是一個字符串,所有的JSON數據都放在這個字符串中,一般為服務器返回的數據。
解析JSON數組
Gson gson = new Gson(); List<User> userList = gson.fromJson(jsonData, new TypeToken<User>(){}.getType());
因為是解析JSON數組,所以我們要用一個List來存放這個數組,List中的每一個對象就是JSON數組中的每一個元素。
具體實例
要解析的JSON數據:
{ "user": "user1", "pwd": "123456", "jsonArray": [ {"user": "user1", "pwd": "123456"}, {"user": "user2", "pwd": "123456"} ], "result": "成功" }
映射的Java類:
public class Data { private String user; private String pwd; private String result; private List<JsonArrayBean> jsonArray; public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } public List<JsonArrayBean> getJsonArray() { return jsonArray; } public void setJsonArray(List<JsonArrayBean> jsonArray) { this.jsonArray = jsonArray; } public class JsonArrayBean { private String user; private String pwd; public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } } }
解析的方法:
private void parseJSONData(String jsonData) { Gson gson = new Gson(); Data data = gson.fromJson(jsonData, Data.class); // data就是整個JSON數據映射的一個對象 String result = data.getResult(); // 取result字段的值 String pwd = data.getPwd(); // 取pwd字段的值 String user = data.getUser(); // 取user字段的值 // 因為jsonArray字段對應的是一個JSON數組,所以要用一個List來對應 List<Data.JsonArrayBean> list = data.getJsonArray(); //取值 for (int i = 0; i < list.size(); i++) { Data.JsonArrayBean jsonArrayBean = list.get(i); String user1 = jsonArrayBean.getUser(); String pwd1 = jsonArrayBean.getPwd(); } }
此處沒有給出網絡通信的代碼,隻給出瞭解析JSON數據的代碼。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Android Gson基本用法學習
- Gson中@JsonAdater註解的幾種方式總結
- java中JSONArray互相轉換List的實現
- java比較兩個json文件的差異及說明
- JSON中fastjson、jackson、gson如何選擇