使用Jackson XMLMapper反序列化含混合元素的XML列表时列表为空的问题
使用Jackson XMLMapper反序列化含混合元素的XML列表时列表为空的问题
我之前也碰到过一模一样的问题!核心原因是Jackson默认没法自动识别同一个<items>容器下混合的<input>和<output>元素,需要调整注解配置来明确它们的归属关系。下面给你两种可行的解决方案:
方案一:创建中间Items类(更清晰,推荐)
这种方式通过一个中间类来对应XML里的<items>标签,结构更符合XML的层级,也更容易维护:
- 先定义
Input和Output类,注意用@JacksonXmlProperty(isAttribute = true)来映射name属性:
public class Input { @JacksonXmlProperty(isAttribute = true) private String name; // 记得添加getter和setter方法 } public class Output { @JacksonXmlProperty(isAttribute = true) private String name; // 记得添加getter和setter方法 }
- 创建
Items类,用来包裹两个列表。这里的关键是给每个列表加上@JacksonXmlElementWrapper(useWrapping = false),告诉Jackson不要给列表额外生成一层包装标签,直接把<items>下的<input>/<output>元素收集到对应列表中:
public class Items { @JacksonXmlProperty(localName = "input") @JacksonXmlElementWrapper(useWrapping = false) private List<Input> inputs; @JacksonXmlProperty(localName = "output") @JacksonXmlElementWrapper(useWrapping = false) private List<Output> outputs; // 记得添加getter和setter方法 }
- 修改
Action类,添加Items字段并映射到<items>标签:
public class Action { @JsonProperty("items") private Items items; // 记得添加getter和setter方法 }
- 你的
Model类保持原有配置就可以:
public class Model { @JsonProperty("action") private Action action; // 记得添加getter和setter方法 }
方案二:直接在Action类中配置注解(无需中间类)
如果不想额外创建Items类,也可以直接在Action的两个列表字段上配置注解,指定它们的共同容器是<items>:
public class Action { @JacksonXmlElementWrapper(localName = "items") @JacksonXmlProperty(localName = "input") private List<Input> inputs; @JacksonXmlElementWrapper(localName = "items") @JacksonXmlProperty(localName = "output") private List<Output> outputs; // 记得添加getter和setter方法 }
这里两个列表都用@JacksonXmlElementWrapper(localName = "items"),Jackson就会自动把<items>下的所有<input>元素放到inputs列表,<output>元素放到outputs列表。
完成配置后,再运行你原来的反序列化代码:
Model m = xmlMapper.readValue(file, Model.class);
现在两个列表应该就能正确获取到XML里的元素了。
备注:内容来源于stack exchange,提问作者user1154644
相关产品推荐
相关产品推荐

