【问题标题】:Jackson XML List Elements Match Their Root NameJackson XML 列表元素匹配它们的根名称
【发布时间】:2018-08-25 19:07:45
【问题描述】:

使用杰克逊的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>

【问题讨论】:

    标签: java xml jackson jackson-dataformat-xml


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      相关资源
      最近更新 更多