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

使用kotlinx.serialisation时,如何保留枚举大写名称并解析JSON值?

解决kotlinx.serialization枚举保留命名规范同时获取JSON对应值的问题

枚举的name属性返回的是枚举常量自身的名称(比如BAD),而你需要的是@SerialName注解中定义的JSON字段值,以下是两种可行的实现方式:

方式一:手动添加自定义属性(推荐)

直接给每个枚举常量添加一个存储JSON对应值的属性,既保留全大写的枚举命名规范,又能直接获取目标字符串:

@Serializable
internal enum class State(val serialValue: String) {
    @SerialName("good") GOOD("good"),
    @SerialName("bad") BAD("bad"),
    @SerialName("near_good") NEAR_GOOD("near_good")
}

使用时直接访问serialValue属性即可:

val state = State.BAD
assert(state.serialValue == "bad") // 断言通过

这种方式无需依赖反射,代码直观易读,适合枚举值数量不多的场景。

方式二:通过反射自动获取注解值

如果不想手动重复书写字符串,可以利用反射读取@SerialName注解的内容,避免冗余代码:

@Serializable
internal enum class State {
    @SerialName("good") GOOD,
    @SerialName("bad") BAD,
    @SerialName("near_good") NEAR_GOOD;

    val serialValue: String
        get() = runCatching {
            javaClass.getField(name).getAnnotation(SerialName::class.java)?.value
        }.getOrNull() ?: name
}

同样通过state.serialValue获取JSON对应值,这种方式适合枚举值较多的场景,但会有轻微的反射性能开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:35:17