You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jackson-dataformat-xml反序列化同时含属性和子元素的XML节点

问题核心原因

Jackson处理XML列表类型字段时,默认会认为列表外层有一个和字段名同名的wrapper标签,你给出的data标签下直接就是多个waterlevel子元素,没有额外wrapper,所以第一种写法里列表识别失败返回空。

解决方案

给TideData类中的waterlevel字段添加Jackson XML专用注解,关闭默认的wrapper包装逻辑,明确绑定子元素名称即可:
首先确保你已经引入了Jackson XML注解的相关依赖,然后修改TideData类如下:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty

data class TideData(
    val type: String = "",
    val unit: String = "",
    // 核心注解:关闭列表外层wrapper,直接取当前标签下的waterlevel子元素
    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "waterlevel")
    val waterlevel: List<WaterLevel> = emptyList()
)

其他数据类保持你第一种写法的结构即可,不需要额外修改。

可选优化(避免Kotlin数据类反序列化异常)

如果运行时出现无参构造相关的报错,建议在构建XmlMapper时注册Kotlin模块:

// 先确保引入jackson-module-kotlin依赖
val mapper: ObjectMapper = XmlMapper.builder()
    .addModule(KotlinModule.Builder().build()) // 注册Kotlin模块适配数据类
    .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
    .disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES)
    .build()

修改后反序列化就能同时拿到data标签的type、unit属性和完整的waterlevel列表了。

内容的提问来源于stack exchange,提问作者larsesen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:54:06