杰克逊反序列化 – Kotlin数据类 – 每个映射器缺少字段的默认值
鉴于这个数据类:
data class MyPojo(val notInJson: Int, val inJson: Int)
假设我想实现一个形式的函数:
fun deserialize(jsonString: String, valueForFieldNotInJson: Int): MyPojo
jsonString
不包含名为notInJson
的字段。 还假设我无法控制MyPojo
类的定义。
我怎么能使用杰克逊库反序列化MyPojo
从jsonString
和增加缺少的字段( 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) }
- Kotlin:数据类的JsonProperty.Access.READ_ONLY
- 注册反序列化器以包装类型的List
- 你如何声明一个使用Jackson XML的JsonTypeInfo.As.WRAPPER_OBJECT的多态字段?
- Kotlin Jackson从JSON生成对象
- 将ByteArrayOutputStream转换为Kotlin中的json
- Spring数据Elasticsearch与Kotlin数据类的脚本字段导致Jackson序列化问题
- 在通用属性解串器中包装所有标准和自定义Jackson解串器
- 如何在Kotlin中使用Jackson JsonSubTypes注释
- Spring启动REST服务:JSON反序列化不起作用