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

jm81lzqq  于 2022-11-08  发布在  Kotlin
关注(0)|答案(3)|浏览(189)

我有一个愚蠢的问题让我有点吃惊。我有一个枚举和一个数据类,如下所示:

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

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

我需要将其作为json字符串发送,但普通的desarilizer会生成这样的json

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

但我需要

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

据我所知,Kotlin允许在数据类中重写getter,但我没有成功......

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

但我想我错过了什么。

wpx232ag

wpx232ag1#

最简单的方法可能是使用@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"}
bfhwhh0e

bfhwhh0e2#

最简单的方法是用@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)

我使用的是Jackson2.12.0版。这里有一个关于Jackson的枚举操作的好读物-https://www.baeldung.com/jackson-serialize-enums

sd2nnvve

sd2nnvve3#

此外,您还可以拥有包含2个以上字段的枚举,这些字段是您希望序列化的

enum class MyEventType(
        val firstField: String,
        val secondField: String,
        val thirdField: String
) {
        MY_ENUM("firstFieldValue", "secondFieldValue", "thirdFieldValue")
}

您可以选择以下两个选项之一:
1.将**@JsonValue放在一个方法**上(我们称之为getter),该方法将返回所需的值(* 如果您只需要部分字段 *):

@JsonValue
fun getSerializedObject(): String {
        return "{firstField: $firstField, thirdField: $thirdField}"
}

结果将为"{firstField: firstFieldValue, thirdField: thirdFieldValue}"
1.将**@JsonFormat(shape = JsonFormat. shope.OBJECT)放在你的枚举**类上(用于序列化类作为通用类):

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
 enum class MyEventType(
         val firstField: String,
         val secondField: String,
         val thirdField: String
 ) {
         MY_ENUM("firstField", "secondField", "thirdField")
 }

结果将为"{"firstField": "firstFieldValue", "secondField": "secondFieldValue", "thirdField": "thirdFieldValue"}"

相关问题