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

Gson序列化数字键引发变量声明冲突问题求解

解决Gson序列化时数字键对象的Kotlin数据类声明冲突问题

问题分析

你遇到的Conflicting declarations错误,核心原因是Kotlin不允许以纯数字作为变量名,你定义的GRUPPEN数据类里用var 1 : String?这种写法本身就不符合Kotlin语法规范,编译器无法识别这些数字标识符,最终导致声明冲突。

另外需要注意:你的TestModel中GRUPPEN字段定义为ArrayList<GRUPPEN>,但JSON里的GRUPPEN是一个键值对对象,不是数组,这也是需要修正的错误点。

解决方案

推荐两种实用方案,根据你的需求选择:

方案1:用Map替代自定义数据类(最灵活)

JSON中的GRUPPEN本质是键为字符串数字、值为字符串的键值对集合,直接用Kotlin的Map<String, String?>类型对应即可,无需定义GRUPPEN数据类:

修改TestModel中的GRUPPEN字段:

data class TestModel (
    @SerializedName("STATUS") val STATUS: Int,
    @SerializedName("ORG_NAME") val ORG_NAME : String,
    @SerializedName("VORNAME") val VORNAME : String,
    @SerializedName("NACHNAME") val NACHNAME : String,
    @SerializedName("PERSONEN") val PERSONEN : ArrayList<PERSONEN> = arrayListOf(),
    // 替换为Map类型,空值也能正确解析
    @SerializedName("GRUPPEN") val GRUPPEN: Map<String, String?> = emptyMap()
)

Gson会自动将JSON对象解析为Map,你可以通过GRUPPEN["1"]、GRUPPEN["2"]这样的方式获取对应的值,新增或减少键也不需要修改代码,灵活性最高。

方案2:给变量起合法名称配合SerializedName映射

如果一定要用自定义数据类,给每个数字键对应的变量起合法的Kotlin变量名,通过@SerializedName映射到JSON的数字键:

data class GRUPPEN(
    @SerializedName("1") var group1: String? = null,
    @SerializedName("2") var group2: String? = null,
    // ... 依次映射到30
    @SerializedName("30") var group30: String? = null
)

同时修正TestModel中的GRUPPEN字段类型:

@SerializedName("GRUPPEN") val GRUPPEN: GRUPPEN? = null

这种方式适合键的数量固定且不会变化的场景,但扩展性较差,新增键时需要修改数据类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:30:34