如何在Jackson中编写自定义属性反序列化器

时间:2018-12-27 15:58:31

标签: java json kotlin jackson deserialization

我有很多不同的类,这些类的属性需要自定义反序列化。

示例:

data class Specific(val a: String, val b: String) // <-- Needs special deserialization
data class Foo(val value: String, val sp: Specific)
data class Bar(val something: Int, val sp: Specific)

我尝试使用StdDeserializer创建自定义解串器。而且只有当我为实际的类(FooBar)编写反序列化器时,此方法才有效,但是我只想为Specific类型编写一个反序列化器。

当我使用Kotlin时,我会喜欢使用非Java注释的方式。

1 个答案:

答案 0 :(得分:0)

使用将要进行反序列化的ObjectMapper,首先为Specific类注册一个自定义反序列化器。然后,在反序列化此类的实例时,无论您是直接对其进行反序列化,还是作为其他要反序列化的对象的属性,它都将使用它。

例如,您可以执行以下操作:

class SpecificDeserializer() : StdDeserializer<Specific>(Specific::class.java) {
    override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Specific {
        // Deserialize
    }
}

val mapper = jacksonObjectMapper()
mapper.registerModule(SimpleModule().also {
    it.addDeserializer(Specific::class.java, SpecificDeserializer())
})

val foo = mapper.readValue<Foo>(...

对此进行了解释here。请注意,对于序列化,可以采用相同的方法。