2017-04-17 115 views
0

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to anindya.fb.datamodel.DatumGSON類型轉換錯誤

我有一個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.** { *; } 

但這並沒有解決錯誤。任何幫助,將不勝感激。

回答

1

問題是你正在存儲一個散列圖,其中的類型信息在閱讀時會被刪除。

變化

favoriteList = gson.fromJson(json, HashMap.class); 

favoriteList = gson.fromJson(json, new TypeToken<HashMap<String, Datum>>(){}.getType); 
+0

謝謝。我在腦子裏徘徊了一天! :/ –

+0

不用擔心我曾經咬過我一千次。 – JakeWilson801

0

嘗試這樣的事情...

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; 
} 
1

You need to get the type of HashMap<String, Datum> so do this, Type type = new TypeToken<HashMap<String, Datum>>(){}.getType(); then

favoriteList = gson.fromJson(json, type); 
+0

你是正確的,但如果它是一個類,但它不是它的集合類型這就是Gson類型轉換錯誤的原因 – Remario