使用Jackson支持Kotlin中的继承链对象的反序列化

时间:2018-07-20 15:59:33

标签: kotlin jackson

假设我们需要遵守此类对象继承结构的反序列化:

open class Parent(
    @JsonProperty("parent_value")
    val parentValue: String = "default"
)

class Child(
    @JsonProperty("child_value")
    val childValue: String) : Parent()

父级和子级对象均定义自己的字段,并在其上@JsonProperty

我也有一个检查反序列化的测试:

@Test
fun testDeserializeWithInheritance() {

    val map = mapOf("child_value" to "success", "parent_value" to "success")

    val jsonResult = objectMapper.writerWithDefaultPrettyPrinter()
        .writeValueAsString(map)

    println("serialized object: $jsonResult")

    val deserialized: JsonConverterModuleTest.Child = objectMapper.readValue(jsonResult)
    println("deserialized object: withdraw=${deserialized.childValue} parentValue = ${deserialized.parentValue}, exchangeFrom = ${deserialized.parentValue}")

    assertEquals("success", deserialized.childValue)
    assertEquals("success", deserialized.parentValue)
}

但是问题是测试失败并显示错误:

  

序列化对象:{“ child_value”:“ success”,“ parent_value”:   “成功”}

     

org.junit.ComparisonFailure:父值不相等:
  预期:成功
  实际:默认

如何正确反序列化子对象?主要目标是在子类中不重复字段或@JsonProperty注释。

我对此问题有解决方案,但愿意接受更好的解决方案

1 个答案:

答案 0 :(得分:1)

之所以会发生此问题,是因为构造函数字段上的注释不会自动应用到该字段或getter(kotlin mechanizm)。还似乎在反序列化子对象时未对其进行处理。
杰克逊支持字段或getter方法上的注释,因此合适的解决方案是

open class Parent(
    @get:JsonProperty("parent_value")
    val parentValue: String = "default"
)

open class Parent(
    @field:JsonProperty("parent_value")
    val parentValue: String = "default"
)

测试完成