Gson对泛型的支持(TypeToken的使用)

原文

简单的例子:

List < Person > ps = gson.fromJson(str, new TypeToken < List < Person >> (){}.getType());

特别注意:
TypeToken在创建对象的时候(编译时)就要指明类型,以下情况是错误的:

public class ApiTask<T> {
    private final Type mType;
    private final Gson mGson;
 
    public ApiTask() {
        mType = new TypeToken<ResCommon<T>>() {
        }.getType();
        mGson = new Gson();
    }
}

以上形式的代码在调用mGson.fromJson(json,mType)方法时就会抛出如下异常:

Caused by: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.xxx

正确的例子:

public class ApiTask {
    private final Type mType;
    private final Gson mGson;
 
    public ApiTask( Type type ) {
        mType=type;
        mGson = new Gson();
    }
}
 
//创建 TypeToken对象时,<>括号中的类型都是确定的
new  ApiTask  ( new TypeToken<ResCommon<ReqRider>>() {}.getType())

或者:

public class ApiTask<T> {
    private final Type mType;
    private final Gson mGson;
 
    public ApiTask( TypeToken<ResCommon<T>> typeToken ) {
        mType=typeToken.getType();
        mGson = new Gson();
    }
}
 
//使用
new ApiTask<>(new TypeToken<ResCommon<ReqRider>>(){});

参考地址:Strange behavior when deserializing nested, generic classes with GSON

有关Java获取泛型的文章:

Java中定义泛型<T>时,怎么获得泛型的类型

Java为什么要添加运行时获取泛型的方法?

你会知道为什么TypeToken必须创建子类对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.概述2.Gson的目标3.Gson的性能和扩展性4.Gson的使用者5.如何使用Gson 通过Maven来使用...
    人失格阅读 14,853评论 2 18
  • 基于非墨上一篇关于泛型的文章,不知道大家是否已经做好了阅读Gson源码的准备?本篇文章,非墨将简单带大家过一下Gs...
    非墨Zero阅读 10,264评论 6 14
  • 关于json,gson是最常用到的一个库。平常使用时我通常使用Gson gson = new Gson();的方式...
    黑泥卡阅读 13,475评论 1 14
  • 昨晚又大意,所以很晚睡。今晚早点:)
    泽阳9阅读 1,488评论 0 0
  • 今天期末考试,老师来飞信,下午5:40接孩子,考完后还要为六年级的布置考场。苗到6点多才提着铺盖出来,真是老师的好...
    苗苗的麻麻阅读 1,241评论 0 0