java - Gson,带有泛型的 ClassCastException

标签 java generics serialization gson

我有下面的代码来反序列化 json 数组并且找到了它。 但是,如果我尝试迭代列表,我将收到 ClassCastException。 如果我用 MyObj 替换通用类型 T 并且迭代有效。 但我想让反序列化代码变得通用。 你能帮我解决这个错误吗? 提前致谢。

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to MyObj

json反序列化代码

public static <T> List<T> mapFromJsonArray(String respInArray) {
    Type listType = new TypeToken<ArrayList<T>>(){}.getType();
    List<T> ret = new Gson().fromJson(respInArray, listType);
    return ret;
}

for 循环出错。

List<MyObj> myObjResponse = JsonUtil.<MyObj>mapFromJsonArray(jsonResponse);
for(MyObj obj : myObjResponse){ // Class cast exception 
    //do something
}

最佳答案

你当然需要给 mapFromJsonArray比这更多的信息——这是不可避免的,因为 <T> 的绑定(bind)每次调用都是 entirely erased at runtime .你所有的TypeToken正在做的是试图具体化你没有的信息。

但是您需要做的就是传入元素类型,这样就可以了:

public static <T> List<T> mapFromJsonArray(String respInArray, Class<T> elementClass) {
    Type listType = new TypeToken<List<T>>(){}
               .where(new TypeParameter<T>(){}, elementClass).getType();
    return new Gson().fromJson(respInArray, listType);
}

调用起来并不比你的更笨拙:

List<MyObj> myObjResponse = mapFromJsonArray(jsonResponse, MyObj.class);

关于java - Gson,带有泛型的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25431859/

相关文章:

java - 通过 "add"方法的参数创建对象在 java 中是否可接受?

java - 关于 Java 泛型下限用法 : ? super T

c# - xml 中的 DataContract/DataMember 多个元素

android - 将 Apache Pig 导入 Android 项目导致 "Unable to execute dex: Java heap space"错误

java - Spring @transactional与MongoDB一起工作吗?

java - 是否可以使对话框结束脚本?

java - Android Realm copyToRealmOrUpdate 创建嵌套对象的副本

c# - 如何使用反射动态创建通用 C# 对象?

typescript - 具有通用叶包装器的可重用模型特定树结构

java - 使用 ReadObject 和 WriteObject 的自定义序列化