Gson與List對象間的相親之旅

圖片描述

隨着人們的生活水平的提升,連帶着人與人之間的相親渠道也進一步改善。最近偶爾看到幾檔相親的綜藝節目,不論是平民仍是明星。可見相親的熱潮正撲面而來。這不Google與Java兩個老傢伙也坐不住了,分別想着本身排行285的兒子Gson與本身排行570的女兒List<T>也該到了相親的年齡了。因而Google與Java兩個老油條會心一笑,一塊兒策劃了今天的此次相親之旅。java

地下戀情

Google回到家就將此事告訴了Gson,通知他明天就去Android Studio匆匆那年餐廳見面。Gson欲言欲止,好像另有隱情,但在父親高大身軀與凌厲的眼神下答應了下來,並且父親可以在這衆多的兒子中想到本身,也不忍心拒絕父親的善意。json

Gson回到房,躺着牀上,腦海回想起本身與Java排行520的女兒Object的地下戀情。數組

Gson與Object的第一次見面仍是被它的Json字符串裝扮所吸引。那一天她宛如一朵含苞待放的牡丹花,美而不妖,豔而不俗,千嬌百媚,無與倫比。(以上均爲Gson視角,請勿迷戀。如下爲code視角)微信

{
    "marquee": {
        "content": "翠綠煙紗散花裙",
        "status": true
    }
}

這一下就激起了Gson的慾望,並且Gson還有點小得意,對於這種女孩他已經有本身的一套完整攻略方案。既然知道了它的Json字符串格式,就能夠迅速建立出它對應的java類ide

public class HomeMarqueeModel {
 
    private MarqueeModel marquee;
 
    public static class MarqueeModel {
        private String content;
        private boolean status;
 
        public String getContent() {
            return content;
        }
 
        public boolean isStatus() {
            return status;
        }
    }
 
    public MarqueeModel getMarquee() {
        return marquee;
    }
}

而後再根據API攻略法則第3089條,使用fromJson方案進行攻略,成功率高達100%學習

HomeMarqueeModel model = new Gson().fromJson(jsonStr, HomeMarqueeModel.class);

就這樣Gson完成了對Object的第一次攻略,獲取到了Object的好感。但Gson不知足,爲了徹底讓Object對本身死心塌地,必須應對Object的全部Json字符串格式。this

回去以後,Gson在Android Studio微信平臺與Java中的好哥們泛型T打探Object的特性。通過交流,發現T它恰好是這方面的能手,T告訴Gson每個Object都有它獨用的Class屬性,爲了表明全部的Class類型,恰好可使用它的泛型T來表示,因而就有了Class<T>url

次日,Gson主動出擊邀請Object去Android Studio匆匆那年餐廳吃飯。Gson仍是使用它的fromJson方法,只是在這方法上加入了T的思想。spa

public <T> T getObjectGirl(String jsonStr, Class<T> tGirl) {
        T girl = getGson().fromJson(jsonStr, tGirl);
        return girl;
    }

就這樣,Gson完成對Object的全部類型的攻略,今後再也不爲女朋友而發愁。
回想結束,拉回到現實,對於明天的相親,Gson打算先用以前的方法試一下,畢竟Gson通過前面的成功實例,仍是有點小膨脹,code

初次見面

早上9點,Gson整裝待發,開着本身的蘭博基尼向Android Studio匆匆那年餐廳進發。大約10點Gson到達餐廳,且已經選好了一處風景優雅且面朝大海的位置,靜靜的等候List的到來。半小時以後,只見一個身穿藕色紗衫的女孩,臉帶微笑,身形苗條,長髮披向背心,用一根銀色絲帶輕輕挽住,迎面而來。Gson望着她的身影,只覺這女孩身旁似有煙霞輕籠,當真非塵世中人。(以上均爲Gson視角,請勿迷戀。如下爲code視角)

[
    {
        "title": "身穿藕色紗衫",
        "url": "http://127.0.0.1:8000/admin2/operation/banner-list/",
        "status": true
    },
    {
        "title": "長髮披向背心",
        "url": "http://127.0.0.1:8000/admin2/operation/banner-list/",
        "status": true
    }
]

爲了保守起見,Gson決定仍是循序漸進來,首先建立出該Json字符串列表的java類

public class HomeBannerModel {
    private String title;
    private String url;
    private boolean status;
 
    public String getTitle() {
        return title;
    }
 
    public String getUrl() {
        return url;
    }
 
    public boolean isStatus() {
        return status;
    }
}

而後再使用fromJson方案進行攻略,稍微不一樣的是這裏它是一個數組

HomeBannerModel[] array = new Gson().fromJson(jsonStr, HomeBannerModel[].class);
List<HomeBannerModel> list = Arrays.asList(array);

嗯,看樣子效果不錯,有進一步發展的機會。因而Gson又展現它的另外一個攻略

Type type = new TypeToken<List<HomeBannerModel>>(){}.getType();
List<HomeBannerModel> list = new Gson().fromJson(jsonStr, type);

果真,Gson再一次成功逗笑了List。Gson的膨脹心再一次暴漲。Gson因而大膽起來,套用以前泛型T的思想。因而有了下面的第一次T嘗試

clipboard.png

發現不行,不支持這種泛型T解析。既然這種不行,還就換另外一種,因而就有了第二次T的嘗試

public <T> List<T> getListGirl(String jsonStr) {
      Type type = new TypeToken<List<T>>(){}.getType();
      List<T> listGirl = new Gson().fromJson(jsonStr, type);
      return listGirl;
}

發現沒問題,那麼再來實踐運行一下。發現會報以下異常,致使小姐姐不開心。

java.lang.AssertionError: illegal type variable reference

說明Gson解析不支持該泛型T書寫,致使Type解析出錯,Gson一下懵了,那該咋整呢?雖然前面的攻略有效果,但最後的嘗試沒有成功。但天色以晚,今天的相親也只能就此打住,有待進一步商榷。

請教

回到家Gson一直掛念着這件事,束手無策。Google看到本身兒子愁眉苦展的樣子,不經詢問今天的進展。瞭解狀況後,Google給Gson的建議是,能夠去請教下ParameterizedType。因而Gson火燒眉毛的去找ParameterizedType學習人生真諦。

通過請教,發現ParameterizedType是繼承於Type,本身另外提供了三個抽象方法,分別爲

  1. Type[] getActualTypeArguments() 返回真正所需的Type類型數組
  2. Type getRawType() 返回原始的Type類型
  3. Type getOwnerType() 返回此類的成員類型,例如:O<T>.I<S>。若是爲頂層類型,則返回null。

因此爲了解決以前的問題,Gson打算先自定義一個GirlParameterizedType類,讓它實現ParameterizedType接口。code以下:

private static class GirlParameterizedType implements ParameterizedType {
 
        private Class aClass;
 
        GirlParameterizedType(Class aClass) {
            this.aClass = aClass;
        }
 
        @NonNull
        @Override
        public Type[] getActualTypeArguments() {
            return new Type[]{aClass};
        }
 
        @NonNull
        @Override
        public Type getRawType() {
            return List.class;
        }
 
        @Override
        public Type getOwnerType() {
            return null;
        }
    }

既然找到問題所在,Gson火燒眉毛的邀請List去逛Android Studio商城,但願明天可以順利拿下List女神。

再次相見

在Android Studio商城,Gson再一次看到了List,只不過她今天已經換了一身裝扮。只見她身穿粉紅玫瑰香緊身袍袍袖上衣,下罩翠綠煙紗散花裙,腰間用金絲軟煙羅系成一個大大的蝴蝶結,鬢髮低垂斜插碧玉瓚鳳釵,顯的體態修長妖妖豔豔勾人魂魄。不過Gson已早有準備,直接步入主題,拿出昨天準備好的GirlParameterizedType。

public <T> List<T> getListGirl(String jsonStr, Class<T> tClass) {
      Type type =  getGson().fromJson(response, new HttpClientParameterizedType(tClass));
      List<T> listGirl = new Gson().fromJson(jsonStr, type);
      return listGirl;
}

發現是如此的簡單,一擊必中,直擊List芳心。因而一小時以後,Gson雙手已經掛滿了商品,額頭也滿頭大汗,但List還有意未盡的樣子,Gson萬萬沒想到最後竟然敗在購物上,果真帶女孩來商城就是個錯誤的選擇...

此次的相親也算完美結束,只不過Gson心中又有了心的疑慮,對於Object與List都是百年難遇的女孩,該如何抉擇呢?要不各位看官這個抉擇就交給大家,相信大家會作出正確的抉擇的,畢竟你們都不想在code的人生中留下一絲bug的身影。

最後,不知你們看的感覺如何,有什麼感覺也能夠反饋給我。若是喜歡這種方式,能夠關注個人公衆號:Android補給站,以便及時推送最新文章給你喲~

clipboard.png

相關文章
相關標籤/搜索