我正在使用 Jackson (jackson-dataformat-xml, v2.13.0) 將 XML 字串映射到相應的 Kotlin 物件。XML 如下所示:
<tide>
<service cominfo="Some text..."/>
<locationdata>
<location name="Oslo" code="OSL" latitude="59.904794"
longitude="10.753642" delay="0" factor="1.00" obsname="Oslo"
obscode="OSL" descr="Tidevann fra Oslo"/>
<reflevelcode>CD</reflevelcode>
<data type="prediction" unit="cm">
<waterlevel value="88.5" time="2021-10-22T06:50:00 01:00" flag="high"/>
<waterlevel value="69.8" time="2021-10-22T11:53:00 01:00" flag="low"/>
<waterlevel value="95.1" time="2021-10-22T19:05:00 01:00" flag="high"/>
</data>
</locationdata>
</tide>
我很難提取資料欄位中的任何內容,因為它包含屬性值(type和unit)以及waterlevel串列。
在我的控制器中,我正在做一個簡單的映射:
val mapper: ObjectMapper = XmlMapper.builder()
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES)
.build()
val tide: Tide = mapper.readValue(tideLevels, Tide::class.java)
我無法從資料標簽中獲取所有內容。在我看來,好像我必須在屬性和子元素之間做出選擇。以下映射:
data class Tide(
val service: TideServiceInfo? = null,
val locationdata: LocationData? = null
)
data class LocationData(
val location: Location? = null,
val reflevelcode: String = "",
val data: TideData? = null
)
data class TideData(
val type: String = "",
val unit: String = "",
val waterlevel: List<WaterLevel> = emptyList()
)
data class WaterLevel(
val value: String = "",
val time: String = "",
val flag: String = ""
)
給我一個空水位陣列的結果json:
{
"service": {
"cominfo": "Some text..."
},
"locationdata": {
"location": {shortened for brevity},
"reflevelcode": "CD",
"data": {
"type": "prediction",
"unit": "cm",
"waterlevel": []
}
}
}
但是,如果我改為選擇映射到以下資料類:
data class Tide(
val service: TideServiceInfo? = null,
val locationdata: LocationData? = null
)
data class LocationData(
val location: Location? = null,
val reflevelcode: String = "",
val data: List<WaterLevel> = emptyList()
)
data class WaterLevel(
val value: String = "",
val time: String = "",
val flag: String = ""
)
我的結果 json 設定了資料欄位,沒有型別和單位:
{
"service": {
"cominfo": "Some text..."
},
"locationdata": {
"location": { shortened for brevity },
"reflevelcode": "CD",
"data": [
{
"value": "88.5",
"time": "2021-10-22T06:50:00 01:00",
"flag": "high"
},
{
"value": "69.8",
"time": "2021-10-22T11:53:00 01:00",
"flag": "low"
},
{
"value": "95.1",
"time": "2021-10-22T19:05:00 01:00",
"flag": "high"
}
]
}
}
我曾嘗試研究注釋以放置資料欄位,例如@JacksonXmlProperty,但我不明白這如何幫助我實作我的解決方案。我在這里遺漏了一些明顯的東西嗎?
uj5u.com熱心網友回復:
添加
@field:JacksonXmlProperty(isAttribute = true)
到您的屬性欄位。有關更多資訊,請參閱檔案。
請注意,您需要@field在 Kotlin 中將注釋應用于實際物件欄位
uj5u.com熱心網友回復:
@Evgeny 的建議對我不起作用,但它確實引導我走上了正確的搜索道路。基本上,這里建議的答案,介紹了useWrapping=false原來是這樣做的伎倆。
所以我得到了我想要的使用以下內容:
@field:JacksonXmlElementWrapper(useWrapping = false)
val waterlevel: List<WaterLevel> = emptyList()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341390.html
標籤:xml 科特林 杰克逊-数据格式-xml
