使用 Jackson 解析混合类型数组,包括字符串

问题描述 投票:0回答:1

我必须解析一个返回包含混合对象和字符串的数组的 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。

json kotlin jackson
1个回答
0
投票

是的,使用自定义序列化器是最实用的解决方案!将注释 @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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.