Android-Exception整理之com.google.gson.internal.xxx cannot be cast to xxx

问题描述:

项目用到了Google的Gson库,不混淆情况下一切正常,当代码混淆打包时会遇到这种异常

1
java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to xxx

或者

1
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to xxx

解决方案:

1.首先确保有正确的在混淆文件proguard-rules.pro有这么几行:

1
2
3
4
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.examples.android.model.** { *; }

2.确保自己项目内用到的model类或者bean类(总之就是和Gson解析相关的模型类)有在proguard-rules.pro内keep声明:

1
2
3
4
5
-keep class com.package.name.bean.** { *; }
-keep class com.package.name.bean.entity.** { *; }
-keep public class com.package.name.R$*{
public static final int *;

}

注:com.package.name是你项目包名

3.JSON串转成自定义类的List对象时,要使用正确的方式:

首先习惯使用的错误方式是

1
List<T> list = gson.fromJson(jsonString, type);

正确的方法应该是这样的

1
2
Type type = new TypeToken<List<T>>(){}.getType();
List<T> list = gson.fromJson(jsonString, type)