Gson toJson/toJsonTree 开启minifyEnabled后字段名被混淆问题求助
解决Gson混淆后JSON键名被替换的问题
问题根源
开启minifyEnabled true后,ProGuard/R8会混淆Kotlin类的字段名,Gson默认依赖字段名生成JSON键,所以会出现a、b、c这类短名称。
具体解决方案
1. 给字段添加@SerializedName注解(最可靠)
直接给数据类的每个字段指定JSON键名,不管混淆怎么改,Gson都会用注解里的名称:
data class User( @SerializedName("username") val name: String, @SerializedName("user_age") val age: Int )
2. 修正混淆规则
如果不想加注解,要确保你的数据类和Gson相关类不被混淆,在proguard-rules.pro里添加以下规则:
# 保留Gson核心类及注解信息 -keep class com.google.gson.** { *; } -keep class com.google.gson.reflect.TypeToken { *; } -keepattributes Signature,Annotation,RuntimeVisibleAnnotations # 保留你的数据类(替换成实际包名) -keep class com.your.app.models.** { *; } # 保留数据类的字段和构造函数 -keepclassmembers class com.your.app.models.** { <fields>; <init>(...); }
注意把com.your.app.models换成你存放数据类的实际包路径,否则规则不会生效。
3. 适配R8混淆(Android Gradle 3.4+默认用R8)
如果用的是R8,除了上面的规则,还要确保注解不被移除:
-keepattributes RuntimeVisibleParameterAnnotations
4. 检查类的构造函数
如果是普通Kotlin类(非数据类),Gson需要无参构造函数才能正常序列化,要显式声明:
class User { var username: String = "" var age: Int = 0 // 显式无参构造 constructor() }
总结
优先用@SerializedName注解,配合正确的混淆规则,既能保证混淆效果,又能让Gson生成正确的JSON键名。
内容的提问来源于stack exchange,提问作者puli ajay
相关产品推荐
相关产品推荐

