其實(shí)本來android前端定義的對象類型是對象窥岩,如果后臺沒有值的情況下,理論上給null宰缤,如果是數(shù)組給[]或者null都可以的颂翼。這樣Gson再解析轉(zhuǎn)換的時(shí)候就不會出問題!但是最近重構(gòu)發(fā)現(xiàn)后臺如果沒有字段值給的是""空字符串慨灭,有值給的是對象字符串朦乏,比如下面:
"\"test\":" +
"{" +
"\"name\": \"hl\", " +
"\"id\": \"110\"" +
"}," +
這樣我的Gson解析就報(bào)了字段類型不匹配的相關(guān)錯(cuò)誤!最好的解決方式氧骤,其實(shí)是后臺字段規(guī)范統(tǒng)一呻疹,而且盡量不要給臟數(shù)據(jù),否則時(shí)間長很難維護(hù)和優(yōu)化筹陵!
另外一種情況就是前端做特殊處理刽锤,用Object去接收,用Object去接收的話朦佩,使用的時(shí)候就相對麻煩并思,你需要自己做轉(zhuǎn)換!
比如你的test字段定義的是Object test; 那么Gson解析的時(shí)候得到的結(jié)果類型是
class com.google.gson.internal.LinkedTreeMap
也就是一個(gè)hashmap的一種類型语稠,這個(gè)時(shí)候就不是你說的對象了纺荧。那怎么辦?一種情況是颅筋,你判斷下如果是這種類型的話宙暇,如下操作:
先把linkedTreeMap對象轉(zhuǎn)成json字符串,然后再轉(zhuǎn)成JavaBean
Gson gson = new Gsonbuilder.enableComplexMapKeySerialization().create();
String jsonString = gson.toJson(linkedTreeMap);
JavaBean bean = gson.fromJson(jsonString,JavaBean.class);
另一種方式就是JavaBean提供一個(gè)構(gòu)造函數(shù)议泵,允許傳入LinkedTreeMap進(jìn)行構(gòu)造占贫,相當(dāng)于自己取值來給對象變量賦值!貌似第一種方式更好型奥。采用第一種瞳收,你可以判斷是LinkedTreeMap還是String類型,然后統(tǒng)一做處理螟深!相當(dāng)于就統(tǒng)一封裝到了請求數(shù)據(jù)解析環(huán)節(jié).....
附上自己的一些練習(xí)學(xué)習(xí)吧:
import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;
import java.util.Map;
import java.util.Set;
public class TEstSVDF {
private class User {
private Object test;
private String aa;
private String age;
public Object getTest() {
return test;
}
public void setTest(Object test) {
this.test = test;
}
public String getAa() {
return aa;
}
public void setAa(String aa) {
this.aa = aa;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
private class Test {
private String id;
private String name;
}
}
public static void main(String[] args) {
Object a = 1;
Object b = 10;
System.out.println("托爾斯泰" + (a.toString() + b));
String jsonStr = "{" +
"\"test\":" +
"{" +
"\"name\": \"hl\", " +
"\"id\": \"110\"" +
"}," +
" \"aa\":\"啊\", " +
"\"age\": \"10000\"" +
"}";
String jsonStr2 = "{" +
"\"test\":\"sb\", " +
"\"aa\":\"啊\", " +
"\"age\": \"10000\"" +
"}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);
User user2 = gson.fromJson(jsonStr2, User.class);
System.out.println(user.getAa());
System.out.println(user.getAge());
System.out.println(user.getTest().getClass());
if (user.getTest() instanceof LinkedTreeMap) {
// 遍歷
Set set = ((LinkedTreeMap) user.getTest()).entrySet();
for (Object o : set) {
Map.Entry entry = (Map.Entry) o;
System.out.print(entry.getKey() + ":" + entry.getValue() + " ");
}
// 對應(yīng)取值
LinkedTreeMap linkedTreeMap = (LinkedTreeMap) user.getTest();
System.out.print(linkedTreeMap.get("id"));
System.out.print(linkedTreeMap.get("name"));
} else if (user.getTest() instanceof User.Test) {
User.Test test = (User.Test) user.getTest();
System.out.println("id=" + test.id);
System.out.println("name=" + test.name);
}
if (user2.getTest() instanceof String) {
System.out.println(user2.getTest());
}
}
}
Gson支持泛型喲界弧。。搭综。那樣的話,或許對你自己封裝rx家族兑巾,自定義處理請求和數(shù)據(jù)有很大幫助。小萌新的之前封裝的目前來用還是不錯(cuò)蒋歌。。但是今天又接觸了一些Gson的東西后堂油,還可以再完善下.....當(dāng)然還得多向好的第三方庫學(xué)習(xí).....
這個(gè)鏈接還是滿全面的 Java 中 Gson的使用 - 【cosmo】 - 博客園