簡體   English   中英

Jackson XML 序列化:與父級同名的嵌套元素

[英]Jackson XML Serialization: Nested Element with Same Name as Parent

我有一個復雜的 xml 類型,其中包含一個名稱與父元素相同的嵌套元素,但是當我對其進行序列化時,嵌套元素在包含在另一個元素中時被設置為父元素的文本。

DTO 看起來像這樣:

@JacksonXmlRootElement(localName = "address")
public class Address{
    @JacksonXmlText(false)
    @JsonProperty
    private String address;
    @JsonProperty
    private String city;
    //getters and setters
}

@JacksonXmlRootElement(localName = "person")
public Person {
    private String name;
    private Address address;
}

我的 XmlMapper 配置:

XmlMapper xmlMapper = XmlMapper.xmlBuilder()
    .defaultUseWrapper(false)
    .serializationInclusion(NON_NULL)
    .build();
xmlMapper.getFactory()
    .getXMLOutputFactory()
    .setProperty("javax.xml.stream.isRepairingNamespaces", false);

當我自己序列化一個地址時,我得到了預期值:

<address><address>123 East Street</address><city>metropolis</city></address>

但是當我將 Address 序列化為另一個 DTO 的嵌套對象時,例如 Person,則 address 屬性將序列化為 Address 父對象的文本。

實際的 XML:

<person><address>123 East Street<city>metropolis</city></address></person>

預期的 XML:

<person><address><address>123 East Street</address><city>metropolis</city></address></person>

我已經知道這只是糟糕的XML 設計,但這就是我必須做的!

關於如何獲得預期的 XML 輸出的任何想法?

編輯

我通過創建另一個帶有標記為文本的“值”字段的 DTO 找到了一種解決方法。

@JacksonXmlRootElement(localName = "address")
public class StreetAddress{
    @JacksonXmlText
    private String value;
    //getters and setters
}
//snip
@JacksonXmlRootElement(localName = "address")
public class Address{
    @JsonProperty
    private StreetAddress address;
    @JsonProperty
    private String city;
    //getters and setters
}

當按如下方式連接 DTO 時,XML 輸出將按預期生成。 我使用了jackson-annotationsjackson-dataformat-xml 2.10版。 除了額外的 getter 和 setter 之外,與代碼沒有區別。

Address a = new Address();
a.setCity("metropolis");
a.setAddress("123 East Street");
Person p = new Person();
p.setAddress(a);
xmlMapper.writeValue(new PrintWriter(System.out), p);

輸出

<person><address><address>123 East Street</address><city>metropolis</city></address></person>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM