[英]Gson type cast error
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to anindya.fb.datamodel.Datum
我有一個HashMap
:
static HashMap<String, Datum> favoriteList = new HashMap<>();
然后通過以下方式將其寫入GSON:
String json = gson.toJson(favoriteList);
mEditor.putString(PREF_FAVORITE, json);
mEditor.commit();
並得到這樣的:
gson = new Gson();
String json = mPref.getString(PREF_FAVORITE, "");
if (json.equals(""))
favoriteList = new HashMap<>();
else
favoriteList = gson.fromJson(json, HashMap.class);
要基於值發回此HashMap
的一部分,我正在這樣做:
ArrayList<Datum> data = new ArrayList<>();
for(String key: favoriteType.keySet()) {
if(favoriteType.get(key).equals(type)) { //type is a parameter to this method
data.add(favoriteList.get(key));
}
}
return data;
但是,當我嘗試訪問此數據時,出現此錯誤:
final Datum curData = data.get(position);
給出一個錯誤:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to anindya.fb.datamodel.Datum
我遇到了一些帖子,提到在proguard
文件中添加行。
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
但這並不能解決錯誤。 任何幫助,將不勝感激。
問題是您存儲的哈希圖的類型信息在讀取時會被丟棄。
更改
favoriteList = gson.fromJson(json, HashMap.class);
至
favoriteList = gson.fromJson(json, new TypeToken<HashMap<String, Datum>>(){}.getType);
您需要獲取
HashMap<String, Datum>
的類型,執行此操作,Type type = new TypeToken<HashMap<String, Datum>>(){}.getType();
然后
favoriteList = gson.fromJson(json, type);
試試這樣的東西...
public Map<String, Datum> toMap(String jsonString) {
Type type = new TypeToken<Map<String, Datum>>(){}.getType();
Gson gson = new GsonBuilder().create();
Map<String, Datum> map = gson.fromJson(jsonString, type);
return map;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.