在 Kotlin 中将枚举字段序列化为 JSON

Serialize enum field into JSON in Kotlin

我有一个愚蠢的问题让我有点吃惊。 我有一个枚举和一个数据 class 是这样的:

enum class MyEventType(val typeName: String) {
    FIRST("firstEventReceived")
}

data class MyEvent(
    val id: String,
    val event: MyEventType
)

我需要将其作为 json 字符串发送,但普通的去海水化器会生成这样的 json

{ 
    "id": "identifier",
    "event": "FIRST"
}

但我需要

{ 
    "id": "identifier",
    "event": "firstEventReceived"
}

据我了解,kotlin 允许覆盖数据 class 中的 getter,但我没有成功...尝试制作

data class MyEvent(
    val id: String
) {
    val event: MyEventType get() event.typeName
}

但我错过了一些东西,我想...

最简单的方法可能是用@JsonValue注释属性:

enum class MyEventType(@JsonValue val typeName: String) {
    FIRST("firstEventReceived")
}

data class MyEvent(
    val id: String,
    val event: MyEventType
)


fun main() {
    MyEvent(id = "foo", event = MyEventType.FIRST)
        .let { jacksonObjectMapper().writeValueAsString(it) }
        .let { println(it) }
}

打印:

{"id":"foo","event":"firstEventReceived"}

最简单的方法是用@JsonValue注释typeName。这将根据需要序列化和反序列化枚举字段。

enum class MyEventType(@JsonValue val typeName: String) {
    FIRST("firstEventReceived");
}

另一种方法是使用 @JsonFormat(如果您使用的 jackson 版本 < 2.9);


enum class MyEventType(@JsonFormat(shape = JsonFormat.Shape.OBJECT) val typeName: String) {
    FIRST("firstEventReceived");
}

举个例子;

  @JvmStatic
    fun main(args: Array<String>) {
        val mapper = jacksonObjectMapper()
        val json = mapper.writeValueAsString(MyEvent("1", MyEventType.FIRST))
        println(json)

        val event = mapper.readValue<MyEvent>(json)
        println(event)
    }

你得到了输出;

{"id":"1","event":"firstEventReceived"}
MyEvent(id=1, event=FIRST)

我使用的是 Jackson 2.12.0 版。这是一本关于 Jackson 枚举操作的好书 - https://www.baeldung.com/jackson-serialize-enums