Jackson读取混合同级节点时覆盖旧节点问题求助
Jackson XML解析混合顺序同级节点时列表被覆盖的问题
这不是Jackson的Bug,是XML模块默认解析行为导致的。
问题原因
当使用@JacksonXmlElementWrapper(useWrapping = false)绑定无包装的列表节点时,Jackson XML模块默认会在遇到非列表节点时结束当前列表的解析。后续再出现的同类型节点会被当作新的列表数据源,覆盖之前已收集的内容。在你的测试用例中,第一个<NodeA>被解析后,遇到<NodeB>时Jackson认为nodeA字段已解析完成,当再次遇到<NodeA>时会重新初始化列表,最终只保留最后一个<NodeA>的内容。
解决方案
通过启用DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY配置,让Jackson将单个节点视为数组的一部分,同时允许累积所有分散出现的同类型节点。修改你的XmlMapper初始化代码:
val xmlMapper = XmlMapper.builder() .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) .addModule(kotlinModule()) .build()
修改后,Jackson会将所有<NodeA>节点(无论是否被其他节点隔开)都收集到nodeA列表中,测试即可通过。
注意:确保你的Jackson XML模块版本为2.9及以上,该配置在较早版本中可能存在兼容性问题。
内容的提问来源于stack exchange,提问作者Daniel Cheng
相关产品推荐
相关产品推荐

