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.
相关产品推荐
相关产品推荐

