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

