Intereting Posts
Как изменить свойства тестовых объектов в KotlinTest через interceptTestCase Можно ли сохранить «Unit» в качестве возвращаемого типа функции Kotlin при вызове с Java? Kotlin: Как запустить функцию с задержкой с помощью функции расширения Могу ли я обеспечить нулевую безопасность для типов платформ из Java API? Сортировка данных из MutableList в Котлине прослушивание сокетов на клиентском и голосовом сервисе для Android-мессенджера Tornadofx – управление объектом таблицы tableview во время сборки Kotlin Cast String как String.Companion Конфигурация Джерси CORS для разрешения ответов с сервера Как создать анонимный интерфейс в моем классе Kotlin и использовать его? Как использовать Spring Data JPA методы, возвращающие поток в блок try-with-resources в Котлине? Kotlin установлен в Null If Not Null Параметр «Контроллер весны» не изменяется с параметром Вытягивание данных из API с помощью okHTTP и GSON Как компилировать Kotlin для включения jar Java с командной строкой?

Джексон-десериализация – классы данных Kotlin – значения по умолчанию для отсутствующих полей на картографе

Учитывая этот класс данных:

data class MyPojo(val notInJson: Int, val inJson: Int) 

Предположим, что я хочу реализовать функцию формы:

 fun deserialize(jsonString: String, valueForFieldNotInJson: Int): MyPojo 

Где jsonString не включает поле с именем notInJson . Предположим также, что я не контролирую определение класса MyPojo .

Как я мог использовать библиотеку Джексона для десериализации MyPojo из jsonString и увеличения отсутствующего поля ( notInJson ) из параметра valueForFieldNotInJson ?

Заметки:

  • В основном, речь идет о десериализации класса Immutable, где некоторые поля поступают от Json, а другие – во время выполнения.
  • Использование пользовательских десериализаторов или сборщиков не будет работать, поскольку отсутствующие значения неизвестны во время компиляции.

Это может быть достигнуто путем объединения MinInAnnotations и ValueInjection .

Полное решение:

 data class MyPojo(val notInJson: Int, val inJson: Int) class MyPojoMixIn { @JacksonInject("notInJson") val notInJson: Int = 0 } fun deserialize(jsonString: String, valueForFieldNotInJson: Int): MyPojo { val injectables = InjectableValues.Std().addValue("notInJson", valueForFieldNotInJson) val reader = jacksonObjectMapper() .addMixIn(MyPojo::class.java, MyPojoMixIn::class.java) .readerFor(MyPojo::class.java) .with(injectables) return reader.readValue(jsonString) }