【问题标题】:Jackson XML ArrayList output having two wrapper elementsJackson XML ArrayList 输出具有两个包装器元素
【发布时间】: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>

【问题讨论】:

    标签: java xml jackson marshalling


    【解决方案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")

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2020-12-11
      • 1970-01-01
      相关资源
      最近更新 更多