Kotlin使用Gson解析含横杠key的JSON时如何完成字段映射
Kotlin 中Gson映射带横杠等特殊符号JSON字段的方案
方案1:使用@SerializedName注解(最常用,推荐)
Gson提供的@SerializedName注解可以显式指定字段对应的JSON key,不受Kotlin变量名命名规则限制,是处理个别特殊命名字段的最优方案。
示例代码:
import com.google.gson.annotations.SerializedName // 对应sprite下的世代数据类 data class PokemonSprites( // 显式指定对应JSON中的key为generation-i @SerializedName("generation-i") val generationI: GenerationI? = null, @SerializedName("generation-ii") val generationIi: GenerationIi? = null, // 其他正常命名的字段可以不用加注解,保持默认映射规则即可 val frontDefault: String? = null ) // 对应generation-i的内部结构,按需声明字段即可 data class GenerationI( @SerializedName("red-blue") val redBlue: GameSprite? = null, val yellow: GameSprite? = null ) data class GameSprite( val frontDefault: String? = null, val backDefault: String? = null )
这种方式的优势是灵活,不需要修改全局配置,对特殊命名的字段做单独适配即可,兼容性最高。
方案2:全局配置字段命名策略(适合大量字段遵循统一规则的场景)
如果你需要解析的所有JSON key都遵循「小写单词加横杠分隔」的规则,对应Kotlin侧是小驼峰命名,可以在构建Gson实例时自定义全局字段命名策略,不用逐个加注解:
示例代码:
import com.google.gson.FieldNamingStrategy import com.google.gson.GsonBuilder import java.lang.reflect.Field val gson = GsonBuilder() .setFieldNamingStrategy(object : FieldNamingStrategy { override fun translateName(field: Field): String { // 将Kotlin侧的小驼峰变量名转为横杠分隔的小写key return field.name.replace(Regex("(?=[A-Z])"), "-").lowercase() } }) .create()
配置后,Kotlin侧的generationI字段会自动映射到JSON的generation-ikey,redBlue会自动映射到red-blue,不需要再加单独的@SerializedName注解。
注意:
@SerializedName注解的优先级高于全局命名策略,个别不符合统一规则的字段仍可以单独加@SerializedName做适配。
内容的提问来源于stack exchange,提问作者Felipe Polo
相关产品推荐
相关产品推荐

