免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
GSON使用筆記(3)

本文通過3個問題來討論如何使用GSON把JSON反序列化為List。

問題1

有這樣兩個類:

  1. class MyObj {  
  2.     int x;  
  3. }  
  4.   
  5. class MyList {  
  6.     List<MyObj> objList = new LinkedList<>();  
  7. }  
那下面的測試能通過嗎?
  1. @Test  
  2. public void test1() {  
  3.     MyList myList = new Gson().fromJson("{objList:[]}", MyList.class);  
  4.     Assert.assertEquals(LinkedList.class, myList.objList.getClass());  
  5. }  

答案1

答案是,測試通不過!原因是GSON不知道objList的具體類型,因此只能選擇默認(rèn)的ArrayList。更詳細(xì)的解釋,可以參考這篇文章和ConstructorConstructor類的源代碼。如果確實(shí)想讓GSON創(chuàng)建LinkedList實(shí)例該怎么辦呢?也簡單,就是給objList一個更具體的類型:

  1. class MyList {  
  2.     LinkedList<MyObj> objList = new LinkedList<>();  
  3. }  

問題2

下面的測試能通過嗎?

  1. @Test  
  2. public void test2() {  
  3.     ArrayList<?> list = new Gson().fromJson("[{x:1}]", ArrayList.class);  
  4.     Assert.assertEquals(1, list.size());  
  5.     Assert.assertEquals(MyObj.class, list.get(0).getClass());  
  6. }  

答案2

很明顯,不能。因?yàn)閒romJson方法不能從"[{x:1}]"參數(shù)推測出數(shù)組里放的是MyObj類型的對象,也無法從ArrayList.class參數(shù)得到這個信息。那么改成下面這樣呢?

  1. ArrayList<MyObj> list = new Gson().fromJson("[{x:1}]", ArrayList<MyObj>.class);  
更糟糕,連編譯都無法通過!因?yàn)镴ava的泛型是用擦拭法實(shí)現(xiàn)的,說白了只是編譯器提供給程序員的語法糖,根本不存在ArrayList<MyObj>這樣一個類。那么怎樣才能讓GSON反序列化出我們想要的泛型對象呢?答案是,請TypeToken幫忙:
  1. @Test  
  2. public void test3() {  
  3.     Type type = new TypeToken<ArrayList<MyObj>>() {}.getType();  
  4.     ArrayList<MyObj> list = new Gson().fromJson("[{x:1}]", type);  
  5.     Assert.assertEquals(1, list.size());  
  6.     Assert.assertEquals(MyObj.class, list.get(0).getClass());  
  7. }  
GSON提供了TypeToken這個類來幫助我們捕獲(capture)像ArrayList<MyObj>這樣的泛型信息。test3()的第一行代碼創(chuàng)建了一個匿名內(nèi)部類,這樣,Java編譯器就會把泛型信息編譯到這個匿名內(nèi)部類里,然后在運(yùn)行時就可以被getType()方法用反射API提取到。

問題3

如果我想寫一個通用的方法,把json反序列化成List,下面這個方法可行嗎?

  1. public static <T> ArrayList<T> jsonToList(String json, Class<T> classOfT) {  
  2.     Type type = new TypeToken<ArrayList<T>>() {}.getType();  
  3.     return new Gson().fromJson(json, type);  
  4. }  
這個測試能通過嗎?
  1. @Test  
  2. public void test4() {  
  3.     ArrayList<MyObj> list = jsonToList("[{x:1}]", MyObj.class);  
  4.     Assert.assertEquals(1, list.size());  
  5.     Assert.assertEquals(MyObj.class, list.get(0).getClass());  
  6. }  

答案3

答案是,方法不可行(雖然能編譯通過),測試通不過!還是因?yàn)镴ava泛型的擦除法,詳細(xì)的回答可以看stackoverflow上的這個問題。那還有辦法實(shí)現(xiàn)jsonToList()這個通用方法呢?有的,只是稍微復(fù)雜一點(diǎn):

  1. public static <T> ArrayList<T> jsonToList(String json, Class<T> classOfT) {  
  2.     Type type = new TypeToken<ArrayList<JsonObject>>(){}.getType();  
  3.     ArrayList<JsonObject> jsonObjs = new Gson().fromJson(json, type);  
  4.       
  5.     ArrayList<T> listOfT = new ArrayList<>();  
  6.     for (JsonObject jsonObj : jsonObjs) {  
  7.         listOfT.add(new Gson().fromJson(jsonObj, classOfT));  
  8.     }  
  9.       
  10.     return listOfT;  
  11. }  
分兩步,先反序列化出ArrayList<JsonObject>,然后在一個個的把JsonObject轉(zhuǎn)成classOfT類型的對象。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
使用Gson將Java對象轉(zhuǎn)換為JSON
Gson中fromJson方法的返回值
Google Gson 使用簡介
Gson用戶指南
網(wǎng)易新聞
Gson的使用
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服