java - JAXB:在特殊值的情况下忽略元素序列化(例如 `null` 或 `Double.NaN` )

标签 java xml serialization jaxb

我想使用 JAXB 序列化 Java 对象。该对象具有可能具有特殊值的实例变量,例如null 或在另一种情况下 Double.NaN

如果实例变量具有此特殊值,我如何才能仅忽略它?

这可能吗?

<小时/>

MWE

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClass {

   private double value;
   private Object object;

   public void setValue(double value){this.value = value;}
   public double getValue(){return value;}

   public void setObject(Object object){this.object = object;}
   public Object getObject(){return object;}

}

因此,如果 valueDouble.NaN 并且 object 不为 null 我想得到

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MyClass>
  <object>
    ...
  </object>
</MyClass>

在另一种情况下,如果value不是Double.NaN并且objectnull我想要得到

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MyClass>
  <value>1.0</value>
</MyClass>

最佳答案

默认情况下,空值不会生成 XML,因此您需要 object属性(property)已经处理完毕。

至于特殊double value,创建一个专门的方法来生成 XML value值,并抑制 value 的法线映射或getValue()到 XML。

这可以通过使用 @XmlTransient 进行注释来完成,或通过使用 XmlAccessType.NONE 禁用自动属性选择,因此只有带注释的属性才会映射到 XML。

这是使用第二种方法的示例:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class MyClass {

    private double value;
    private Foo foo;

    public MyClass() {
    }
    public MyClass(double value, Foo foo) {
        this.value = value;
        this.foo = foo;
    }

    public void setValue(double value){this.value = value;}
    public double getValue(){return this.value;}

    public void setFoo(Foo foo){this.foo = foo;}
    @XmlElement() public Foo getFoo(){return this.foo;}

    @XmlElement(name = "value")
    public Double getXmlValue() {
        if (Double.isFinite(this.value))
            return this.value;
        return null;
    }
}

public class Foo {
    @XmlElement()
    public String getBar() { return "Test"; }
}

测试

JAXBContext jaxbContext = JAXBContext.newInstance(MyClass.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal(new MyClass(Math.PI, null), System.out);
marshaller.marshal(new MyClass(Double.NaN, new Foo()), System.out);

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass>
    <value>3.141592653589793</value>
</myClass>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass>
    <foo>
        <bar>Test</bar>
    </foo>
</myClass>

注意如何<foo>第一个缺失,因为它是 null ,和<value>第二个缺失,因为 NaN值返回为 null值。

正常使用MyClass仍然会得到 NaN调用时的值getValue() .

关于java - JAXB:在特殊值的情况下忽略元素序列化(例如 `null` 或 `Double.NaN` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56859267/

相关文章:

java - 扩展实现某些包含泛型的类的 ArrayList 不起作用?

java - 我该如何修复这个错误?查找轮廓(OpenCV)

java - 如何向此 Spring Boot 代码添加新的 REST GET 操作?

c++ - 使用 boost 属性树创建多节 xml

serialization - 如何序列化日志文件的内容并理解日志文件?

如果使用 setter 和 getter,则 Swift Decode 不起作用

java - 修改android内部类/调用处理

android - Cordova Phonegap - Android 地理定位显示错误 : Application does not have sufficient geolocation permissions error

xml - 打开文件对话框以选择 XML 文件

c++ - 使用序列化 C++ 保存游戏状态