我必须解析一个返回包含混合对象和字符串的数组的 API。 Jackson 解析器确实抛出异常,因为我不知道如何构建 Kotlin 类。市场上有一些关于使用 JsonTypeInfo 注释进行多态性的信息,但遗憾的是我找不到任何人处理数组中的混合对象和字符串。有一个简单的解决方案吗? 也许有一个提示:Jackson 解析器已设置且无法更改。
val mapper = ObjectMapper().registerKotlinModule()
.registerModules(JavaTimeModule())
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
data class Polymorphism(
val list: List<Test>
)
data class Test(
val anything: String?,
val subTest1: SubTest1?
)
data class SubTest1(
val myString: String
)
val testJson = """
{
"list": [
"Hello World",
{
"subTest1": {
"myString": "Teststring"
}
},
{
"subTest1": {
"myString": "Another Teststring"
}
}
]
}
""".trimIndent()
val poly = mapper.readValue(testJson, Polymorphism::class.java)
在上面的示例中,抛出了 Jackson MismatchedInputException。
是的,使用自定义序列化器是最实用的解决方案!将注释 @JsonDeserialize(using = TestSerializer::class) 放在 TestClass 上并执行以下实现,解决了上述问题。
object TestSerializer : JsonDeserializer<TestClass>() {
override fun deserialize(parser: JsonParser, context: DeserializationContext): TestClass {
val node = parser.readValueAsTree<JsonNode>()
val retVal = when(node.nodeType) {
JsonNodeType.OBJECT -> when(node.fieldNames().next()) {
"subTest1" -> TestClass(subTest1 = parser.codec.treeToValue(node["subTest1"], SubTest1::class.java))
else -> TestClass("Unknown field")
}
JsonNodeType.STRING -> TestClass(text = node.asText())
else -> TestClass("Unknown Node")
}
return retVal
}
}