簡體   English   中英

帶有泛型的Gson,ClassCastException

[英]Gson, ClassCastException with Generics

我有下面的代碼反序列化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>綁定在運行時完全被刪除 您所有的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);

TypeToken是在運行時獲取泛型類型信息的技巧。 但是,通過傳遞一個泛型類型參數(T),由於類型擦除,你實際做的是:

Type listType = new TypeToken<ArrayList<Object>>(){}.getType();

這並沒有為Gson提供所需的必要信息,以便正確地反序列化到列表中,因此它不正確地進行反序列化。

一種解決方案可能是將類型標記作為參數傳遞給mapFromJsonArray:

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

List<MyObj> myObjResponse = JsonUtil.<MyObj>mapFromJsonArray(
    jsonResponse, new TypeToken<ArrayList<MyObj>>(){}.getType());

for(MyObj obj : myObjResponse){
    //do something
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM