简体   繁体   English

使用Jackson XML映射器将Java List序列化为XML

[英]Serialize Java List to XML using Jackson XML mapper

Hi I need to create an XML from JAVA using Jackson-dataformat XMLMapper. 嗨,我需要使用Jackson-dataformat XMLMapper从JAVA创建XML。 The XML should be like XML应该是这样的

<Customer>
  <id>1</id>
  <name>Mighty Pulpo</name>
    <addresses>
      <city>austin</city>
      <state>TX</state>
    </addresses>
    <addresses>
      <city>Hong Kong</city>
      <state>Hong Kong</state>
    </addresses>
</Customer>

But I get it always like with an extra "< addresses> < /addresses>" tag. 但我总是喜欢额外的“<addresses> </ addresses>”标签。

<Customer>
  <id>1</id>
  <name>Mighty Pulpo</name>
<addresses>
    <addresses>
      <city>austin</city>
      <state>TX</state>
    </addresses>
    <addresses>
      <city>Hong Kong</city>
      <state>Hong Kong</state>
    </addresses>
<addresses>
</Customer>

I am using below code to create XML 我使用下面的代码来创建XML

JaxbAnnotationModule jaxbAnnotationModule = new JaxbAnnotationModule();
XmlMapper mapper = new XmlMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(jaxbAnnotationModule);
mapper.registerModule(new GuavaModule());
String xml = mapper.writeValueAsString(customer);
System.out.println(xml);

Please can some one help me? 有人可以帮帮我吗? How can I remove the extra tag please. 如何删除额外的标签呢。 I have tried to use @XmlElement but it does not help help. 我试过使用@XmlElement,但它没有帮助。 TIA!! TIA!

Try the below code 请尝试以下代码

@JacksonXmlRootElement(localName = "customer") 
class Customer {

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

    @JacksonXmlProperty(localName = "addresses")
    @JacksonXmlElementWrapper(useWrapping = false)
    private Address[] address;

    //getters, setters, toString
}

class Address {

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

    @JacksonXmlProperty(localName = "state")
    private String state;
    // getter/setter 
}

This setting changes default wrapping behavior, if you don't want to deal with annotation everywhere in your code. 如果您不想在代码中的任何位置处理注释,则此设置会更改默认包装行为。

XmlMapper mapper = new XmlMapper();
mapper.setDefaultUseWrapper(false);

只是为了添加ManojP的答案,如果在变量声明中添加@JacksonXmlElementWrapper(useWrapping = false)不起作用(对我来说就是这种情况),将它添加到getter方法就可以了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM