假设我们需要遵守此类对象继承结构的反序列化:
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
注释。
我对此问题有解决方案,但愿意接受更好的解决方案
答案 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"
)
测试完成