Kotlin解析JSON时data class主构造函数val/var参数报错解决
错误根源
Kotlin属性命名规范不允许标识符包含冒号:,你编写的val im:name: ImName会被编译器识别为「声明名为im的属性,类型为name」,但name既不是合法类型也不是合法的参数声明,因此触发data class主构造参数不合法的编译错误。
解决方案
由于你无法修改接口返回的JSON字段名,只需要通过序列化框架提供的字段映射注解,将合法的Kotlin属性名和JSON中带特殊字符的原始key做绑定即可,不需要改动接口返回结构。
首先先定义嵌套的ImName类,对应im:name字段的内部结构:
data class ImName( val label: String )
根据你项目使用的JSON序列化框架,选择对应的注解写法即可:
- 若使用Gson(Android生态最常用):用
@SerializedName指定JSON原始字段名
import com.google.gson.annotations.SerializedName data class Entry( @SerializedName("im:name") val imName: ImName // 其余带特殊字符的字段(比如im:artist、im:price等)都按该规则映射即可 )
- 若使用Kotlin官方Kotlinx Serialization:用
@SerialName指定JSON原始字段名,注意类需要加@Serializable注解
import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class Entry( @SerialName("im:name") val imName: ImName ) @Serializable data class ImName( val label: String )
- 若使用Jackson:用
@JsonProperty指定JSON原始字段名
import com.fasterxml.jackson.annotation.JsonProperty data class Entry( @JsonProperty("im:name") val imName: ImName )
补充:所有JSON key包含Kotlin标识符不支持的特殊字符(冒号、横杠、空格、Kotlin关键字等)的场景,都可以用该方式处理。
内容的提问来源于stack exchange,提问作者Ibramazin
相关产品推荐
相关产品推荐

