You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:52:07