使用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
相关产品推荐
相关产品推荐

