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

原文

简单的例子:

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

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

public class ApiTask {
    private final Type mType;
    private final Gson mGson;
 
    public ApiTask() {
        mType = new TypeToken>() {
        }.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>() {}.getType())

或者:

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

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

有关Java获取泛型的文章:

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

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

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

你可能感兴趣的:(Gson对泛型的支持(TypeToken的使用))