杰克逊反序列化 – Kotlin数据类 – 每个映射器缺少字段的默认值

鉴于这个数据类:

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

假设我想实现一个形式的函数:

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

jsonString不包含名为notInJson的字段。 还假设我无法控制MyPojo类的定义。

我怎么能使用杰克逊库反序列化MyPojojsonString和增加缺少的字段( notInJson )从valueForFieldNotInJson参数?

笔记:

  • 基本上,问题是关于反序列化一个不可变的类,其中一些字段来自Json,另外一些是在运行时提供的。
  • 使用自定义反序列化器或构建器将不起作用,因为在编译时缺少值是未知的。

这可以通过结合MinInAnnations和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) }