首頁 > 軟體

如何使用GSON解析JSON資料

2022-08-30 14:03:18

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資料的程式碼。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com