在 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
我有一个愚蠢的问题让我有点吃惊。 我有一个枚举和一个数据 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