JAXB Marshaller 不存在值为 null 的元素

作者:编程家 分类: xml 时间:2025-05-02

JAXB Marshaller 不存在值为 null 的元素

在Java开发中,JAXB(Java Architecture for XML Binding)是一个用于将Java对象与XML文档进行相互转换的技术。它可以将Java对象转换为XML文档,也可以将XML文档转换为Java对象。在使用JAXB进行对象与XML的转换时,我们经常会遇到一个问题,即如何处理对象中的null值。

JAXB Marshaller是用于将Java对象转换为XML文档的核心组件,它负责将Java对象的属性映射为XML元素。默认情况下,JAXB Marshaller会忽略值为null的属性,即不会在生成的XML文档中包含这些属性对应的元素。

例如,我们有一个Java对象Person,包含了姓名、年龄和地址三个属性:

java

public class Person {

private String name;

private Integer age;

private String address;

// 省略构造方法和getter、setter方法

}

如果我们将一个值为null的Person对象使用JAXB Marshaller转换为XML文档,生成的XML文档中将不会包含age属性对应的元素。

java

Person person = new Person();

person.setName("Alice");

person.setAge(null);

person.setAddress("123 Main Street");

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);

Marshaller marshaller = jaxbContext.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

StringWriter writer = new StringWriter();

marshaller.marshal(person, writer);

String xml = writer.toString();

System.out.println(xml);

运行以上代码,输出的XML文档如下:

xml

Alice

123 Main Street

可以看到,age属性对应的元素并没有出现在生成的XML文档中。

解决方案:通过设置JAXB Marshaller的属性来包含值为null的元素

当我们希望在生成的XML文档中包含值为null的属性对应的元素时,可以通过设置JAXB Marshaller的属性来实现。

java

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);

设置JAXB Marshaller的setProperty方法的参数为对应的属性名称和值。其中,JAXB_FRAGMENT属性用于指定是否生成XML文档的根元素,JAXB_FORMATTED_OUTPUT属性用于指定是否格式化生成的XML文档,JAXB_FORMATTED_OUTPUT属性用于指定是否生成JSON格式的文档。

下面是修改后的代码:

java

Person person = new Person();

person.setName("Alice");

person.setAge(null);

person.setAddress("123 Main Street");

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);

Marshaller marshaller = jaxbContext.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);

StringWriter writer = new StringWriter();

marshaller.marshal(person, writer);

String xml = writer.toString();

System.out.println(xml);

运行修改后的代码,输出的XML文档如下:

xml

Alice

123 Main Street

可以看到,age属性对应的元素出现在生成的XML文档中,但是它的值为空。

通过设置JAXB Marshaller的属性,我们可以控制生成的XML文档是否包含值为null的属性对应的元素。默认情况下,JAXB Marshaller会忽略值为null的属性,不会在生成的XML文档中包含这些属性对应的元素。如果我们希望在生成的XML文档中包含值为null的元素,可以通过设置JAXB Marshaller的属性来实现。