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

Kotlin Release构建中JSON字段名自动变更导致API调用失败

解决Release构建下Kotlin数据类JSON字段名被混淆的问题

这个问题的核心是Release构建启用了代码混淆(ProGuard/R8),工具会将数据类的字段名压缩为简短名称(如a、b、c),导致JSON序列化/反序列化时字段不匹配,进而引发API调用失败。以下是几种可靠的解决方法:

方法1:用序列化注解指定固定字段名

如果项目使用Gson作为JSON序列化库,直接给数据类的每个字段添加@SerializedName注解,强制指定JSON中使用的字段名:

import com.google.gson.annotations.SerializedName

data class SleepStage(
    @SerializedName("awake") val awake: Double,
    @SerializedName("light") val light: Double,
    @SerializedName("rem") val rem: Double,
    @SerializedName("deep") val deep: Double
)

即使代码被混淆,Gson会优先使用注解中定义的字段名,完全不受混淆影响。

如果使用kotlinx.serialization库,对应使用@SerialName注解:

import kotlinx.serialization.Serializable
import kotlinx.serialization.SerialName

@Serializable
data class SleepStage(
    @SerialName("awake") val awake: Double,
    @SerialName("light") val light: Double,
    @SerialName("rem") val rem: Double,
    @SerialName("deep") val deep: Double
)

方法2:配置混淆规则排除数据类

修改项目的proguard-rules.pro文件,添加规则让混淆工具跳过目标数据类的字段名混淆:

# 保持SleepStage类的所有字段和类名不被混淆
-keep class com.yourpackage.SleepStage { *; }

# 如果数据类都在同一个包下,可以批量排除
-keep class com.yourpackage.models.** { *; }

替换com.yourpackage为实际的包路径,这样混淆工具会保留这些类的原始字段名,序列化时就能生成正确的JSON格式。

方法3:针对kotlinx.serialization的额外混淆配置

如果使用kotlinx.serialization,除了添加@SerialName注解,还需要确保序列化相关的生成类不被混淆,在proguard-rules.pro中添加:

-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.AnnotationsKt
-keep,includedescriptorclasses class com.yourpackage.**$$serializer { *; }
-keepclassmembers class com.yourpackage.** {
    *** Companion;
}
-keepclasseswithmembers class com.yourpackage.** {
    kotlinx.serialization.KSerializer serializer(...);
}

这能保证kotlinx.serialization生成的序列化器正常工作,避免因混淆导致序列化失败。


内容的提问来源于stack exchange,提问作者Saurabh G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:05:19