Gson与List<T>对象间的相亲之旅

栏目: 服务器 · 发布时间: 6年前

内容简介:随着人们的生活水平的提高,连带着人与人之间的相亲渠道也进一步改善。最近偶尔看到几档相亲的综艺节目,不管是平民还是明星。可见相亲的热潮正扑面而来。这不Google与Java两个老家伙也坐不住了,分别想着自己排行285的儿子Gson与自己排行570的女儿ListGoogle回到家就将此事告诉了Gson,通知他明天就去Android Studio匆匆那年餐厅见面。Gson欲言欲止,好像另有隐情,但在父亲高大身躯与凌厉的眼神下答应了下来,而且父亲能够在这众多的儿子中想到自己,也不忍心拒绝父亲的善意。Gson回到房,

随着人们的生活水平的提高,连带着人与人之间的相亲渠道也进一步改善。最近偶尔看到几档相亲的综艺节目,不管是平民还是明星。可见相亲的热潮正扑面而来。这不Google与 Java 两个老家伙也坐不住了,分别想着自己排行285的儿子Gson与自己排行570的女儿List 也该到了相亲的年龄了。于是Google与Java两个老油条会心一笑,一起策划了今天的这次相亲之旅。

地下恋情

Google回到家就将此事告诉了Gson,通知他明天就去Android Studio匆匆那年餐厅见面。Gson欲言欲止,好像另有隐情,但在父亲高大身躯与凌厉的眼神下答应了下来,而且父亲能够在这众多的儿子中想到自己,也不忍心拒绝父亲的善意。

Gson回到房,躺着床上,脑海回想起自己与Java排行520的女儿Object的地下恋情。

Gson与Object的第一次见面还是被它的Json字符串装扮所吸引。那一天她宛如一朵含苞待放的牡丹花,美而不妖,艳而不俗,千娇百媚,无与伦比。(以上均为Gson视角,请勿迷恋。以下为code视角)

{
    "marquee": {
        "content": "翠绿烟纱散花裙",
        "status": true
    }
}

这一下就激起了Gson的欲望,而且Gson还有点小得意,对于这种女孩他已经有自己的一套完整攻略方案。既然知道了它的Json字符串格式,就可以迅速创建出它对应的java类

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字符串格式。

回去之后,Gson在Android Studio微信平台与Java中的好哥们泛型T打探Object的特性。经过交流,发现T它刚好是这方面的能手,T告诉Gson每一个Object都有它独用的Class属性,为了代表所有的Class类型,刚好可以使用它的泛型T来表示,于是就有了 Class<T>

第二天,Gson主动出击邀请Object去Android Studio匆匆那年餐厅吃饭。Gson还是使用它的fromJson方法,只是在这方法上加入了T的思想。

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

就这样,Gson完成对Object的所有类型的攻略,从此不再为女友而发愁。

回想结束,拉回到现实,对于明天的相亲,Gson打算先用之前的方法试一下,毕竟Gson经过前面的成功实例,还是有点小膨胀,

初次见面

早上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尝试

Gson与List<T>对象间的相亲之旅

发现不行,不支持这种泛型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,自己另外提供了三个抽象方法,分别为

O<T>.I<S>

所以为了解决之前的问题,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补给站,以便及时推送最新文章给你哟~

Gson与List<T>对象间的相亲之旅


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Probability and Computing

Probability and Computing

Michael Mitzenmacher、Eli Upfal / Cambridge University Press / 2005-01-31 / USD 66.00

Assuming only an elementary background in discrete mathematics, this textbook is an excellent introduction to the probabilistic techniques and paradigms used in the development of probabilistic algori......一起来看看 《Probability and Computing》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

html转js在线工具
html转js在线工具

html转js在线工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具