杰克逊XML列表元素匹配其根名称

4
使用Jackson的XmlMapper,是否有一种方法可以使对象列表中元素的名称与@JacksonXmlRootElement中给定的localName匹配?
例如,给定以下类:
interface Foo {}

@JacksonXmlRootElement(localName = "bar")
class Bar implements Foo {}

@JacksonXmlRootElement(localName = "baz")
class Baz implements Foo {}

@JacksonXmlRootElement(localName = "container")
class FooContainer {
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Foo> foos;

    FooContainer(List<Foo> foos) {
        this.foos = foos;
    }

    public List<Foo> getFoos() {
        return foos;
    }
}

使用 XmlMapper
FooContainer container = new FooContainer(Arrays.asList(new Bar(), new Baz()));
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.writeValueAsString(container);

我们得到了以下XML文件。
<container>
  <foos/>
  <foos/>
</container>

有没有一种方法可以得到这个呢?
<container>
  <bar/>
  <baz/>
</container>
1个回答

1

我还没有找到一种在Jackson中完成这个任务的方法,但在JAXB中几乎是微不足道的。

interface Foo {}

class Bar implements Foo {}

class Baz implements Foo {}

@XmlRootElement(name = "container")
@XmlAccessorType(XmlAccessType.FIELD)
class FooContainer {
    @XmlElements({
        @XmlElement(name = "bar", type = Bar.class),
        @XmlElement(name = "baz", type = Baz.class)
    })
    private List<Foo> foos;

    FooContainer() {}

    FooContainer(List<Foo> foos) {
        this.foos = foos;
    }

    public List<Foo> getFoos() {
        return foos;
    }
}

反序列化:

FooContainer container = new FooContainer(Arrays.asList(new Bar(), new Baz()));

JAXBContext jaxbContext = JAXBContext.newInstance(FooContainer.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.marshal(container, System.out);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接