Json轉換利器Gson之-實際開發中的特殊需求處理(手動解析-TypeToken處理)
阿新 • • 發佈:2018-12-26
處理方法:
1,先將介面返回的JSON,用gson.tojson(map)方法,將LinkedTreeMap物件轉成String。
2,再通過gson.fromjson(string,type)方法,將String轉成LinkedTreeMap。用到了Type type=new TypeToken<T>(){}.getType;
3,再將LinkedTreeMapf進行遍歷
下面直接上程式碼:(例子中的資料內容與demo不一樣,但資料 結構是一樣的,為了不讓公司的資訊你懂得)
private String jsonString = "{\"Members\":{\"Owner\":{\"ID\":\"26\",\"LoginName\":\"gm1\",\"Name\":\"總經理A\",\"Email\":\" [email protected]\"},\"Host\":{\"ID\":\"29\",\"LoginName\":\"gm3\",\"Name\":\"總經理C\",\"Email\":\"\"},\"Recorder\":{\"ID\":\"26\",\"LoginName\":\"gm1\",\"Name\":\"總經理A\",\"Email\":\"[email protected]\"},\"Members\":[{\"ID\":\"26\",\"LoginName\":\"gm1\",\"Name\":\"總經理A\",\"Email\":\"[email protected] \"},{\"ID\":\"28\",\"LoginName\":\"gm2\",\"Name\":\"總經理B\",\"Email\":\"[email protected]\"},{\"ID\":\"29\",\"LoginName\":\"gm3\",\"Name\":\"總經理C\",\"Email\":\"\"}],\"Attendance\":[{\"ID\":\"29\",\"LoginName\":\"gm3\",\"Name\":\"總經理C\",\"Email\":\"\"}],\"Absence\":[{\"LoginName\":\"gm1\",\"Name\":\"總經理A\",\"Email\":\" [email protected]\"},{\"LoginName\":\"gm2\",\"Name\":\"總經理B\",\"Email\":\"[email protected]\"}]},\"Room\":{\"MeetingID\":\"6fa7eef5-6735-4fb1-a992-8088250be948\",\"MeetingRoomID\":\"2ebbe73b-bee4-4a9e-81c9-f8ffc6ca1149\",\"Address\":\"金融港-302會議室\",\"Date\":\"2017-09-14\",\"Text\":\"2017-09-14 14:00-15:00\",\"Value\":\"[14:00][14:30]\"},\"Attachments\":{\"Items\":[{\"Actor\":\"總經理A\",\"File\":\"1503808491.zip\",\"Url\":\"http://aaa.com/tory/MeetAttents/808491.zip\",\"Time\":\"2017-09-14 15:23\"}]},\"ID\":\"6fa7eef5-735-4f1-a992-8088250be948\",\"Type\":\"專題協調會議\",\"Title\":\"就像在8888\",\"Address\":\"金融港-302會議室\",\"Time\":\"2017-09-14 14:00-15:00\",\"Note\":\"好想到你 \",\"Status\":\"已結束\",\"Author\":\"總經理A\",\"CreatedTime\":\"2017-09-14 14:48\",\"QrCode\":\"eyJ0eXBlIjozLCJpZCI6IjZmYThOTkyLTgwODgCx5YOP5ZyoODg4OCJ9\",\"Action\":\"[VIEW][RECORDER]\"}";
解析程式碼:(只做了json不同級的資料結構解析,剩下的可以自行在學習過程中去完成)
private void parseJson() {
String parseString = "解析:\n";
//GsonBuilder().enableComplexMapKeySerialization().create() 處理Map的key為複雜物件
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Type type = new TypeToken<com.google.gson.internal.LinkedTreeMap<String, Object>>() {
}.getType();
LinkedTreeMap<String, Object> linkedTreeMap = gson.fromJson(jsonString, type);
for (String str : linkedTreeMap.keySet()) {//一級
if (str.equals("Action")) {
String actionStr = (String) linkedTreeMap.get(str);
parseString += "Action:" + actionStr + "\n";
} else if (str.equals("Address")) {
String addressStr = (String) linkedTreeMap.get(str);
parseString += "Address:" + addressStr + "\n";
} else if (str.equals("Author")) {
String authorStr = (String) linkedTreeMap.get(str);
parseString += "Author:" + authorStr + "\n";
} else if (str.equals("CreatedTime")) {
String createdTimeStr = (String) linkedTreeMap.get(str);
parseString += "CreatedTime:" + createdTimeStr + "\n";
} else if (str.equals("ID")) {
String iDStr = (String) linkedTreeMap.get(str);
parseString += "ID:" + iDStr + "\n";
} else if (str.equals("Title")) {
String titleStr = (String) linkedTreeMap.get(str);
parseString += "Title:" + titleStr + "\n";
} else if (str.equals("Type")) {
String typeStr = (String) linkedTreeMap.get(str);
parseString += "Type:" + typeStr + "\n";
} else if (str.equals("Status")) {
String statusStr = (String) linkedTreeMap.get(str);
parseString += "Status:" + statusStr + "\n";
} else if (str.equals("QrCode")) {
String qrCodeStr = (String) linkedTreeMap.get(str);
parseString += "QrCode:" + qrCodeStr + "\n";
} else if (str.equals("Attachments")) {//二級
//1.獲到LinkedTreeMap<String, List<AttachmentsItemBean>>
LinkedTreeMap<String, List<AttachmentsItemBean>> attachmentsStr = (LinkedTreeMap<String, List<AttachmentsItemBean>>) linkedTreeMap.get(str);
//2.將LinkedTreeMap轉成String
String attachmentsJson = gson.toJson(attachmentsStr);
Type type1 = new TypeToken<com.google.gson.internal.LinkedTreeMap<String, List<AttachmentsItemBean>>>() {
}.getType();
//3.再將String轉成LinkedTreeMap<String, List<AttachmentsItemBean>>
//為什麼不能直接用上面1.LinkedTreeMap,因為它無法直接轉化list裡面的物件為AttachmentsItemBean
com.google.gson.internal.LinkedTreeMap<String, List<AttachmentsItemBean>> attachments = gson.fromJson(attachmentsJson, type1);
for (String attachmentsKey : attachments.keySet()) {
List<AttachmentsItemBean> attachmentsItemBeenList = attachments.get(attachmentsKey);
for (int i = 0; i < attachmentsItemBeenList.size(); i++) {
AttachmentsItemBean attachmentsItemBean = attachmentsItemBeenList.get(i);
String actor = attachmentsItemBean.getActor();
String file = attachmentsItemBean.getFile();
String url = attachmentsItemBean.getUrl();
parseString += "\t\t\t--items:" + "actor:" + actor + "\n"
+ "\t\t\t--file:" + file + "\n"
+ "\t\t\t--url:" + url + "\n";
}
}
} else if (str.equals("Members")) {//三級
//1.獲到LinkedTreeMap<String,Object>
LinkedTreeMap<String, Object> LinkedTreeMapMember_s = (LinkedTreeMap<String, Object>) linkedTreeMap.get(str);
//2.將LinkedTreeMap轉成String
String membersStr = gson.toJson(LinkedTreeMapMember_s);
//TypeToken型別轉換
Type type2 = new TypeToken<LinkedTreeMap<String, Object>>() {
}.getType();
//3.再將String轉成LinkedTreeMap<String,Object>
//為什麼不能直接用上面1.LinkedTreeMap,因為它無法直接轉化list裡面的物件為AttachmentsItemBean
com.google.gson.internal.LinkedTreeMap<String, Object> LinkedTreeMapMembers = gson.fromJson(membersStr, type2);
for (String membersKey : LinkedTreeMapMembers.keySet()) {
if (membersKey.equals("Host")) {
LinkedTreeMap<String, String> host = (LinkedTreeMap<String, String>) LinkedTreeMapMembers.get(membersKey);
String hostJson = gson.toJson(host);
LinkedTreeMap<String, String> hostBean = gson.fromJson(hostJson, new TypeToken<com.google.gson.internal.LinkedTreeMap<String, String>>() {
}.getType());
for (String hoststr : hostBean.keySet()) {
String hostValue = hostBean.get(hoststr);
parseString += "\t\t\t----Host----" + hoststr + ":" + hostValue + "\n";
}
}
}
} else if (str.equals("Room")) {
LinkedTreeMap<String, String> roomMap_ = (LinkedTreeMap<String, String>) linkedTreeMap.get(str);
String roomStr = gson.toJson(roomMap_);
Type type3 = new TypeToken<LinkedTreeMap<String, String>>() {
}.getType();
LinkedTreeMap<String, String> roomMap = gson.fromJson(roomStr, type3);
for (String roomKey : roomMap.keySet()) {
String roomValue = roomMap.get(roomKey);
parseString += "\t\t\t--Room:" + roomKey + ":" + roomValue + "\n";
}
}
}
tv.setText(parseString);
}
輸出的結果:
解析:
----Host----ID:29
----Host----LoginName:gm3
----Host----Name:總經理C
----Host----Email:
--Room:MeetingID:6fa7eef5-6735-4fb1-a992-8088250be948
--Room:MeetingRoomID:2ebbe73b-bee4-4a9e-81c9-f8ffc6ca1149
--Room:Address:金融港-302會議室
--Room:Date:2017-09-14
--Room:Text:2017-09-14 14:00-15:00
--Room:Value:[14:00][14:30]
--items:
actor:總經理A
--file:1503808491.zip
--url:http://aaa.com/tory/MeetAttents/808491.zip
ID:6fa7eef5-735-4f1-a992-8088250be948
Type:專題協調會議
Title:就像在8888
Address:金融港-302會議室
Status:已結束
Author:總經理A
CreatedTime:2017-09-14 14:48
QrCode:eyJ0eXBlIjozLCJpZCI6IjZmYThOTkyLTgwODgCx5YOP5ZyoODg4OCJ9
Action:[VIEW][RECORDER]
原始碼Demo下載