你如何让杰克逊使用Kotlin默认参数缺失值?
我有一个看起来像这样的Kotlin数据类,
data class SomeData( private val notInJson: String = "some default value", private val inJson: String )
和一个JSON字符串,我想反序列化成这个类的一个实例 –
{ "inJson" : "value" }
当我试图反序列化这个数据时,我得到一个错误,参数notInJson
不能为null。 看起来像杰克逊传递一个空值,因为它是在JSON字符串中缺少。
有没有办法让杰克逊没有传递任何价值,所以可以使用类定义中指定的默认值?
– 编辑 –
我用映射器注册了一个KotlinModule()。 使用版本2.7.8或涉及的所有杰克逊软件包。
以下代码 –
@Test fun jackson_kotlin_module() { val mapper = ObjectMapper().registerModule(KotlinModule()) println( mapper.readValue("""{ "inJson" : "some value" }""", SomeData::class.java)) }
给我 –
com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple type, class SomeData] value failed (java.lang.IllegalArgumentException): Parameter specified as non-null is null: method SomeData.<init>, parameter notInJson at [Source: { "inJson" : "some value" }; line: 1, column: 27]
默认参数是一个Kotlin功能。 杰克逊不知道这个,所以我们需要通知它能够支持它。 谢天谢地,还有杰出的杰克逊 – 科特林模块让你做到这一点:
val mapper: ObjectMapper = ObjectMapper() .registerModule(KotlinModule()) //let Jackson know about Kotlin ... data class SomeData( private val notInJson: String = "some default value", private val inJson: String ) ... val data = mapper.readValue<SomeData>("""{"inJson": "sample value"}""") println(data) // -> SomeData(notInJson=some default value, inJson=sample value)
有关如何使用它的说明,请参阅jackson-kotlin-module自述文件,并特别注意模块和Jackson本身的版本 。 为了使默认参数起作用,至少需要jackson-kotlin-module的 2.8.4
版本
- 如何将Class <?>转换为Class <T>?
- 如何将JSON反序列化为与Kotlin + Jackson的List <SomeType>
- Kotlin:数据类的JsonProperty.Access.READ_ONLY
- 在Kotlin中,Jackson数据类的反序列化错误
- 在Spring Boot 2.0.0.M1中将Jackson配置为“全局”使用SNAKE_CASE
- 注册反序列化器以包装类型的List
- 为什么Spring MVC JSON的Kotlin返回一个空对象?
- 在Spring项目中将JSON字符串转换为Data Class实例
- 在Kotlin中,为什么杰克逊在某些情况下未能解组未注释的对象,而不是在其他情况下