不在JAXB中输出空列表(对象到字符串)?

时间:2019-12-06 17:24:54

标签: java jaxb

我有一个可能包含空列表的对象。如果列表为空,则我不希望该标签出现在XML的String输出中。 但是,JAXB仍在输出空标记。

我在RemoteEdition.java类中的字段:

@XmlElementWrapper(name = "dealings")
@XmlElement(name = "dealing")
private List<Dealing> dealings;

dealings为空列表时所需的输出:

<remoteEdition>
</remoteEdition>

实际输出:

<remoteEdition>
    <dealings/>
</remoteEdition>

在杰克逊中,我将用以下元素注释该元素:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<Dealing> dealings;

JAXB中是否有等效项?我在网络上找不到任何示例... P.s.我已经尝试过this solution,但没有用。

1 个答案:

答案 0 :(得分:1)

实现此目标的一种方法是利用beforeMarshal方法。仅当列表dealings为空但不为null时,才创建此空元素。

因此,如果列表为空,则可以在null方法中将字段设置为beforeMarshal

这是一个自包含的示例:

@XmlRootElement
class Root {

    @XmlElementWrapper(name = "wrapper")
    @XmlElement
    private List<Element> element;

    void beforeMarshal(Marshaller u) {
        if (element != null && element.isEmpty()) {
            element = null;
        }
    }
}

class Element {

}

public static void main(String[] args) throws JAXBException {
    JAXBContext context = JAXBContext.newInstance(Root.class);
    StringWriter writer = new StringWriter();
    Root jaxbElement = new Root();
    jaxbElement.element = new ArrayList<JaxbNullElementWrapper.Element>();
    context.createMarshaller().marshal(jaxbElement, writer);
    System.out.println(writer.toString());
}

输出:<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root/>