如何使用GSON解析JSON數(shù)據(jù)
GSON是谷歌提供的一個開源庫,可以用來解析JSON數(shù)據(jù)
添加依賴
不過GSON并沒有被添加到Android官方的API中,所以如果要使用這個開源庫,我們就要先添加依賴,編輯app/build.gradle文件,
在dependencies閉包中添加如下內(nèi)容:
implementation 'com.google.code.gson:gson:2.7'
JSON數(shù)據(jù)介紹
JSON數(shù)據(jù)分為兩種,對象和數(shù)組,用{ }括起來的是對象,用[ ]括起來的是數(shù)組。
對象:
{
"user": "user1",
"pwd": "123456"
}此處是一個JSON對象,里面有兩個字段,分別是user和pwd。
數(shù)組:
[
{"user": "user1",
"pwd": "123456"},
{"user": "user2",
"pwd": "123456"}
]此處是一個JSON數(shù)組,數(shù)組里面包含兩個對象,每個對象包含兩個字段。
字段和數(shù)組
{
"user": "user1",
"pwd": "123456",
"jsonArray": [
{"user": "user1",
"pwd": "123456"},
{"user": "user2",
"pwd": "123456"}
],
"result": "成功"
}
此處是一個JSON對象,里面包含了字段和數(shù)組。
在實際情況中,一般都是一個JSON對象里面有數(shù)組和其它字段,或者是很多的嵌套,我們只需要一層一層的去解析就可以了。
GsonFormat
Gson是采用對象映射的方式,所以我們要為JSON數(shù)據(jù)創(chuàng)建一個Java對象來與之對應。
我們可以使用GsonFormat插件,迅速的將JSON數(shù)據(jù)轉換成Java對象,使用方法如下:
1、安裝好GsonFormat插件
2、新建一個類,在類里的空白處按Alt+S鍵,并將要轉換的JSON數(shù)據(jù)復制進去,界面如下所示:

注意:自動生成的時候,內(nèi)部類可能會是靜態(tài)的,手動把內(nèi)部類的static去掉。
@SerializedName注解
由于JSON中的一些字段可能不太適合直接作為Java字段來命名,因此這里使用了@SerializedName注解的方式來讓JSON字段和Java字段之間建立映射關系。
例:

此處的Test類為JSON數(shù)據(jù)的一個映射類,而USER和PWD為JSON數(shù)據(jù)中的兩個字段,很明顯,這兩個字段的名字不適合做變量名,所以使用@SerializedName注解的方式來讓USER和user建立映射關系,PWD和password建立映射關系。
Gson的使用
解析JSON對象
Gson gson = new Gson(); User user = gson.fromJson(jsonData, User.class);
此處的User類是JSON數(shù)據(jù)的一個映射類,jsonData是JSON數(shù)據(jù),注意:此處是一個字符串,所有的JSON數(shù)據(jù)都放在這個字符串中,一般為服務器返回的數(shù)據(jù)。
解析JSON數(shù)組
Gson gson = new Gson();
List<User> userList = gson.fromJson(jsonData, new TypeToken<User>(){}.getType());
因為是解析JSON數(shù)組,所以我們要用一個List來存放這個數(shù)組,List中的每一個對象就是JSON數(shù)組中的每一個元素。
具體實例
要解析的JSON數(shù)據(jù):
{
"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數(shù)據(jù)映射的一個對象
String result = data.getResult(); // 取result字段的值
String pwd = data.getPwd(); // 取pwd字段的值
String user = data.getUser(); // 取user字段的值
// 因為jsonArray字段對應的是一個JSON數(shù)組,所以要用一個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();
}
}
此處沒有給出網(wǎng)絡通信的代碼,只給出了解析JSON數(shù)據(jù)的代碼。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java 實戰(zhàn)項目之精品養(yǎng)老院管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+Maven+mybatis+Vue+Mysql實現(xiàn)一個精品養(yǎng)老院管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11
Java調(diào)用echarts提供的地圖壓縮方法來壓縮地圖
今天小編就為大家分享一篇關于Java調(diào)用echarts提供的地圖壓縮方法來壓縮地圖,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
Spring和MyBatis整合自動生成代碼里面text類型遇到的坑
Spring和MyBatis整合以后,使用自動生成代碼工具生成dao和mapper配置文件。下面通過本文給大家介紹Spring和MyBatis整合自動生成代碼里面text類型遇到的坑,需要的朋友參考下吧2018-01-01
基于SpringBoot創(chuàng)建Web頁面并熱更新的操作步驟
SpringBoot是一個用于快速開發(fā)單個微服務的框架,它基于 Spring 框架,簡化了Spring應用的初始化過程和開發(fā)流程,本文給大家介紹了如何基于SpringBoot創(chuàng)建Web頁面并熱更新,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-11-11
websocket在springboot+vue中的使用教程
這篇文章主要介紹了websocket在springboot+vue中的使用教程,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
關于ScheduledThreadPoolExecutor不執(zhí)行的原因分析
這篇文章主要介紹了關于ScheduledThreadPoolExecutor不執(zhí)行的原因分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

