Jackson XML ArrayList 输出具有两个包装器元素

Posted

技术标签:

【中文标题】Jackson XML ArrayList 输出具有两个包装器元素【英文标题】:Jackson XML ArrayList output having two wrapper elements 【发布时间】:2018-06-17 20:37:32 【问题描述】:

我在 Jackson 生成的 XML 输出中获得了两个包装器元素。 我只想要一个。

我有一个 Java bean

@Entity
@Table(name = "CITIES")
@JacksonXmlRootElement(localName = "City")
public class City implements Serializable 

    private static final long serialVersionUID = 21L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JacksonXmlProperty(isAttribute = true)
    private Long id;

    @JacksonXmlProperty    
    private String name;

    @JacksonXmlProperty
    private int population;

    // getters, setters etc

和一个列表包装类。

@JacksonXmlRootElement
public class Cities implements Serializable 

    private static final long serialVersionUID = 22L;

    @JacksonXmlProperty(localName = "City")
    @JacksonXmlElementWrapper(localName = "MyCities")
    private List<City> cities = new ArrayList<>();

    public List<City> getCities() 
        return cities;
    

    public void setCities(List<City> cities) 
        this.cities = cities;
    

我得到这个输出,它有两个包装元素。我想 删除其中之一。

<Cities>
  <MyCities>
    <City id="1">
      <name>Bratislava</name>
      <population>432000</population>
    </City>
    <City id="2">
      <name>Budapest</name>
      <population>1759000</population>
    </City>
    <City id="3">
      <name>Prague</name>
      <population>1280000</population>
    </City>
  <MyCities>
</Cities>

其中一个来自ArrayList,一个来自班级。如何摆脱其中一个包装元素?

我想要的是这样的:

<Cities>
    <City id="1">
      <name>Bratislava</name>
      <population>432000</population>
    </City>
    <City id="2">
      <name>Budapest</name>
      <population>1759000</population>
    </City>
    <City id="3">
      <name>Prague</name>
      <population>1280000</population>
    </City>
</Cities>

【问题讨论】:

【参考方案1】:

“Cities”是根元素,而不是包装器。删除实际的包装元素“MyCities”不会起作用吗?

添加@JacksonXmlElementWrapper(useWrapping = false) 也会有所帮助。

【讨论】:

@JacksonXmlElementWrapper(useWrapping = false) 完成了这项工作。【参考方案2】:

Cities 中将@JacksonXmlElementWrapper(localName = "MyCities") 替换为@JacksonXmlElementWrapper(useWrapping = false) 应该会删除额外的包装器元素。

来自documentation:

@JacksonXmlElementWrapper

允许指定要用于的 XML 元素 包装 List 和 Map 属性;或禁用使用(使用'useWrapping' 设置为假)。

Cities 中实施的修复:

@JacksonXmlRootElement
public class Cities implements Serializable 

    private static final long serialVersionUID = 22L;

    @JacksonXmlProperty(localName = "City")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<City> cities = new ArrayList<>();

    public List<City> getCities() 
        return cities;
    

    public void setCities(List<City> cities) 
        this.cities = cities;
    


您也可以使用mapper.setDefaultUseWrapper(false); 直接在映射器中禁用包装功能。

在这种情况下,您只需从cities 中删除@JacksonXmlElementWrapper(localName = "MyCities")

【讨论】:

以上是关于Jackson XML ArrayList 输出具有两个包装器元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jackson 将 JSON 反序列化为 ArrayList<POJO>

Rest easy 3 + Jackson + Tomcat + XML 响应

Jackson 学习笔记 XML转JSON

Jackson 学习笔记 XML转JSON

解析xml的工具类 -----jackson

spring mvc json 直接把一个对象转换成json格式输出到jsp页面