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

时间:2019-12-10 18:01:09

标签: java jackson jackson-databind jackson2 jackson-dataformat-xml

我有一个复杂的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>

但是当我将一个地址序列化为另一个DTO的嵌套对象(如“人”)时,则将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,将其“ value”字段标记为文本。

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

1 个答案:

答案 0 :(得分:1)

按如下所示连接DTO时,将产生预期的XML输出。我使用了2.10jackson-annotations的{​​{1}}版本。除了额外的getter和setter之外,代码没有任何区别。

jackson-dataformat-xml

输出

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);
相关问题