我在使用 Jackson XML Mapper 正確決議 XML 檔案時遇到了一些麻煩。假設我有這個簡單的 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>標簽?
太感謝了!
uj5u.com熱心網友回復:
這是一個有效的解決方案。請注意,我已使映射器不區分大小寫以處理 XML 中大寫的 Simple 屬性。您可以使用屬性上的注釋來執行此操作,而不是覆寫默認的小寫名稱。還要注意資料類的使用不需要使用 lateinit vars 或類似的東西:
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")
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/443193.html
標籤:爪哇 xml 科特林 杰克逊 杰克逊-数据格式-xml
上一篇:由于url,XML無法呈現
