【问题标题】:Using custom jackson serializer to replace an Enum value使用自定义杰克逊序列化程序替换枚举值
【发布时间】:2020-09-20 09:38:33
【问题描述】:

我正在用 Kotlin 编写一个 Spring Boot 项目。我拥有的 POJO/数据类之一,

data class Employee(
        //... other properties
        val designation: Designation
)

enum class Designation {
    JUN, MID, SEN
}

这个Employee 对象默认序列化为{"designation" : "JUN"}。我想添加一个自定义序列化器,这样这个对象就会像这样序列化,{"designation" : "Junior"}

我添加的序列化器,

@JsonComponent
class DesignationSerialization {
    class Serializer: JsonObjectSerializer<Designation>() {
        override fun serializeObject(designation: Designation, gen: JsonGenerator, provider: SerializerProvider) {
            gen.writeString(designation.pretty)
        }

        private val Designation.pretty: String
            get() = when(this) {
                Designation.JUN -> "Junior"
                Designation.MID -> "Mid-Level"
                Designation.SEN -> "Senior"
            }
    }
}

但是在运行时,我收到了这个错误,

JSON encoding error: Can not write a string, expecting field name (context: Object); nested exception is com.fasterxml.jackson.core.JsonGenerationException: Can not write a string, expecting field name (context: Object)

我也尝试过使用gen.writeStringField("designation", designation.pretty),但它会像这样序列化对象

{
"designation": {"designation": "Mid-Level"}
}

【问题讨论】:

  • @JsonValue 不够用有什么特别的原因吗?

标签: java json spring kotlin jackson


【解决方案1】:

你应该在你的枚举类中添加一个属性并用@JsonValuehttps://www.baeldung.com/jackson-serialize-enums标记它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 2012-09-10
    • 2021-09-10
    • 1970-01-01
    • 2016-01-08
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多