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

开启minify的Release构建中Gson.toJson()忽略@SerializedName如何解决?

解决Gson序列化时@SerializedName在Release构建失效的问题

问题原因

开启minifyEnabled后,R8/ProGuard会混淆数据类的字段名,Gson默认依赖字段名进行序列化,导致@SerializedName注解失效,输出a、b这类混淆后的键名。

解决方法

方法一:给数据类添加@Keep注解

直接在Settings类上添加@Keep注解,让混淆工具跳过对这个类的字段混淆,Gson就能正常识别@SerializedName指定的键名:

import androidx.annotation.Keep

@Keep
data class Settings(
    @SerializedName("custom_field_name_1")
    val field1: Int,

    @SerializedName("custom_field_name_2")
    val field2: Int,
    // ... 其他字段
)

方法二:配置混淆规则

如果不想用@Keep,可以在项目的混淆配置文件(如proguard-rules.pro)中添加规则,保留数据类的字段和Gson相关注解:

# 保留所有注解信息,让Gson能识别@SerializedName
-keepattributes *Annotation*

# 保留Settings类的所有字段,替换成你的实际包名
-keep class com.your.package.name.Settings {
    <fields>;
}

# 或者通用规则:保留所有带有@SerializedName注解的字段
-keepclasseswithmembers class * {
    @com.google.gson.annotations.SerializedName <fields>;
}

方法三:配合@Expose注解(可选)

创建Gson实例时启用excludeFieldsWithoutExposeAnnotation(),同时给需要序列化的字段添加@Expose注解,再配合混淆规则保留相关内容:

val gson = GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation()
    .create()

// 数据类修改
data class Settings(
    @Expose
    @SerializedName("custom_field_name_1")
    val field1: Int,

    @Expose
    @SerializedName("custom_field_name_2")
    val field2: Int,
    // ... 其他字段
)

对应的混淆规则需要额外保留@Expose注解相关的类和字段,这种方法适合需要更精细控制序列化字段的场景。

内容的提问来源于stack exchange,提问作者user924

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:42:18