Java Jackson XML列表元素与其根名称匹配
使用Jackson的Java Jackson XML列表元素与其根名称匹配,java,xml,jackson,jackson-dataformat-xml,Java,Xml,Jackson,Jackson Dataformat Xml,使用Jackson的XmlMapper,是否有办法使对象列表中元素的名称与@JacksonXmlRootElement中给出的localName匹配 例如,给定以下类 interface Foo {} @JacksonXmlRootElement(localName = "bar") class Bar implements Foo {} @JacksonXmlRootElement(localName = "baz") class Baz implements Foo {} @Jacks
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;
}
}
我们得到以下XML
<container>
<foos/>
<foos/>
</container>
有没有办法取而代之呢
<container>
<bar/>
<baz/>
</container>
我在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;
}
}
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);