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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 04:24:03