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

读取XML文件时Java对象丢失Segment段的问题求助

Jackson XML反序列化非连续列表元素丢失问题修复

问题原因

你的XML结构中,<segment>元素并非连续排列——xid="PER"的<segment>之后插入了<person>子节点,后续才是xid="PER1"和xid="PER2"的<segment>。而Jackson XML在处理@JacksonXmlElementWrapper(useWrapping = false)标记的列表字段时,默认行为是遇到非列表元素时重置列表,导致先读取的PER段被后续的PER1、PER2段覆盖,最终列表只保留了后面的元素。

解决方案

给LoopDefinition类中的segments和loops列表字段添加@JacksonXmlMerge注解,该注解会指示Jackson将分散在不同位置的同类型XML元素合并到同一个列表中,而非重置列表。

修改后的LoopDefinition代码

import java.util.List;
    
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlMerge;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@JacksonXmlRootElement(localName = "person")
public class LoopDefinition  {

    @JacksonXmlProperty(isAttribute = true, localName = "xid")
    private String xid;

    @JacksonXmlProperty(localName = "name")
    private String name;

    @JacksonXmlMerge
    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "segment")
    private List<SegmentDefinition> segments;

    @JacksonXmlMerge
    @JacksonXmlElementWrapper(useWrapping = false)
    @JacksonXmlProperty(localName = "person")
    private List<LoopDefinition> loops;
}

验证效果

修改后重新反序列化你的XML,segments列表将会包含三个元素:PER、PER1、PER2,不会再出现元素丢失的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:33:26