web-dev-qa-db-ja.com

シリアライズJava Jackson XMLマッパーを使用してXMLにリスト

こんにちは、Jackson-dataformat XMLMapperを使用してJavaからXMLを作成する必要があります。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>

しかし、私は常に追加の "<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>

以下のコードを使用して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);

誰か助けてもらえますか?余分なタグを削除するにはどうすればよいですか。私は@XmlElementを使用しようとしましたが、助けにはなりません。 TIA !!

19

以下のコードを試してください

@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

コード内のどこでも注釈を処理したくない場合は、この設定によりデフォルトのラップ動作が変更されます。

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

ManojPの答えに追加するだけですが、変数の宣言に@JacksonXmlElementWrapper(useWrapping = false)を追加しても機能しない場合(これは私の場合です)、getterメソッドに追加するとうまくいきます。

1
alphathesis