Как написать десериализаторы пользовательских свойств в Джексоне - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть много разных классов, у которых есть свойство, которое требует специальной десериализации.

Пример:

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.И это работает, только если я пишу десериализатор для фактического класса (Foo и Bar), но я хочу написать только один для типа Specific.

Как яиспользуя Kotlin, я хотел бы, чтобы аннотированный Java-способ к нему.

1 Ответ

0 голосов
/ 02 января 2019

С помощью 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>(...

Это объясняется здесь .Обратите внимание, что для сериализации можно использовать тот же подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...