Gson类型转换错误

时间:2017-04-17 21:10:47

标签: java android gson

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.** { *; }

但是没有修复错误。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

问题是你正在存储一个散列图,其中的类型信息会在您阅读时被删除。

更改

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

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

答案 1 :(得分:1)

  

您需要获取HashMap<String, Datum>的类型   这样做,Type type = new TypeToken<HashMap<String, Datum>>(){}.getType();   然后

  favoriteList = gson.fromJson(json, type);

答案 2 :(得分: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;
}