[英]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.