【问题标题】:How to write custom property deserializers in jackson如何在杰克逊中编写自定义属性反序列化器
【发布时间】:2018-12-27 15:58:31
【问题描述】:

我有很多不同的类,它们都有一个需要自定义反序列化的属性。

例子:

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 注释的方式。

【问题讨论】:

    标签: java json kotlin jackson deserialization


    【解决方案1】:

    使用您将用于进行反序列化的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。请注意,对于序列化,可以采用相同的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      相关资源
      最近更新 更多