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

