web-dev-qa-db-fra.com

Sérialiser Java Lister en XML à l'aide du mappeur Jackson Jackson

Salut, je dois créer un XML à partir de Java en utilisant Jackson-dataformat XMLMapper. Le XML devrait être comme

<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>

Mais je l'obtiens toujours comme avec une balise supplémentaire "<adresses> </ adresses>".

<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>

J'utilise le code ci-dessous pour créer du 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);

Est-ce que quelqu'un peut m'aider, s'il vous plaît? Comment puis-je retirer la balise supplémentaire s'il vous plaît. J'ai essayé d'utiliser @XmlElement mais cela n'aide pas. TIA !!

19
Sharmistha Sinha

Essayez le code ci-dessous

@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 
}
42
ManojP

Ce paramètre modifie le comportement d'habillage par défaut, si vous ne souhaitez pas traiter l'annotation partout dans votre code.

XmlMapper mapper = new XmlMapper();
mapper.setDefaultUseWrapper(false);
3
A Kunin

Juste pour ajouter à la réponse de ManojP, si l'ajout de la fonction @JacksonXmlElementWrapper(useWrapping = false) sur la déclaration de votre variable ne fonctionne pas (ce qui était le cas pour moi), l'ajouter à la méthode getter fera l'affaire.

1
alphathesis