Kotlin -使用Jackson XmlMapper反序列化

gkn4icbw  于 2022-11-09  发布在  Kotlin
关注(0)|答案(1)|浏览(167)

我在使用Jackson XML Mapper正确解析XML文件时遇到了一些麻烦。

<Test>
    <Simple>
        <x>I am x</x>
        <y>I am y</y>
    </Simple>
</Test>

和这个简单的类:

@Root(name="Simple",strict = false)
class Simple {

    @Element(name = "x", required = false)
    lateinit var x :String

    @Element(name = "y", required = false)
    lateinit var y :String

}

编译器不断抛出此错误:
Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Simple" (class Simple), not marked as ignorable (2 known properties: "x", "y"])
我猜这是因为Kotlin在类内找不到文件的正确结构?问题是我需要解析一个大得多的xml文件,并且需要避免镜像xml的每一个元素,否则它会变得巨大。
那么,我如何“部分”解析xml,将根设置为<Simple>标记,而避免使用<Test>标记呢?
非常感谢!

mpbci0fu

mpbci0fu1#

下面是一个可行的解决方案。注意,我已经使Map器不区分大小写,以处理XML中大写的Simple属性。您可以通过在属性上添加注解来覆盖默认的小写名称。还要注意,使用数据类时,不需要使用lateinit变量或类似的变量:

import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.MapperFeature
import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule
import com.fasterxml.jackson.dataformat.xml.XmlMapper
import com.fasterxml.jackson.module.kotlin.registerKotlinModule

data class Simple(val x: String, val y: String)
data class Test(val simple: Simple)

fun main() {

    val xmlDeserializer = XmlMapper(JacksonXmlModule().apply {
        setDefaultUseWrapper(false)
    }).registerKotlinModule()
        .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

    val simple = Simple("x","y")
    val test = Test(simple)
    println(xmlDeserializer.writeValueAsString(test))

    val stringToParse = "<Test><Simple><x>1</x><y>2</y></Simple></Test>"
    val finalObject = xmlDeserializer.readValue(stringToParse, Test::class.java)
    println(finalObject.simple.x)
}

确保您build.gradle.kts具有以下依赖项(如果还没有):

implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.1")
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.1")

相关问题