为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

犯罪嫌疑人X 2023-03-02 16:38:43
我想用JAXB. 该对象具有可能具有特殊值的实例变量,例如null或 在另一种情况下Double.NaN。如果它具有这个特殊值,我怎么能只忽略实例变量呢?这可能吗?一@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;}}value所以在存在Double.NaN和object不存在的情况下null我想得到<?xml version="1.0" encoding="UTF-8" standalone="no"?><MyClass>  <object>    ...  </object></MyClass>在另一种情况下,如果value不是Double.NaN,我object想得到null<?xml version="1.0" encoding="UTF-8" standalone="no"?><MyClass>  <value>1.0</value></MyClass>
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

默认情况下,空值不会生成 XML,因此您对该object属性的要求已经得到处理。

对于特殊double值,创建一个专门的方法来产生 XML值,并抑制or到 XMLvalue的正常映射。valuegetValue()

@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仍会获得值。NaNgetValue()


查看完整回答
反对 回复 2023-03-02
  • 1 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信