Джексон-десериализация – классы данных 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) }