jaxb marshall boolean 值作为整数 (0,1) 问题

标签 jaxb integer boolean marshalling unmarshalling

我的问题看起来很简单,但我无法在 stackoverflow 上找到与之完全相同的任何内容。

我正在使用 jaxb 来编码/取消编码此对象:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "root")
public class MyJaxbObject implements Serializable
{

    @XmlElement(name = "DELETE")
    @XmlJavaTypeAdapter(BooleanIntAdapter.class)
    private Boolean delete;

    @XmlElement(name = "message")
    private String message;

     constructors.. getters... setters...
}

我的BooleanAdapter是一个简单的XmlAdapter<Integer, Boolean>这会将真/假变为 1/0 并返回。

解码有效,但编码无效。它总是会产生这样的结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <DELETE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.or/2001/XMLSchema" xsi:type="xs:boolean">true</DELETE>
    <message>***DONE***</message>
</root>

当我将 xml 元素配置更改为 @XmlElement(name = "DELETE",type = Boolean.class) 时 boolean 值的解编码失败,编码产生以下结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <DELETE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:int">1</DELETE>
    <message>***DONE***</message>
</root>

我将简单的打印消息放入 xml 适配器的 marshal/unmarshal 方法中,并尝试 marshal/unmarshal 这种对象。

我看到在没有类型声明的情况下调用了 unmarshal 方法,但没有调用 marshal。 通过类型声明,仅调用编码(marshal)。

帮忙?? 如何将 boolean 值编码/解码到 {1,0} 或从 {1,0} 编码/取消编码,并可能删除编码 xml 中的 xsi:type?

编辑 - 这是我用来测试 marshal/unmarshal 的代码:

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    JAXBContext context = javax.xml.bind.JAXBContext.newInstance("my.package.classes");
    Unmarshaller unmarshal = context.createUnmarshaller();
    Marshaller marshal = context.createMarshaller();
    marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    String str = "<root><DELETE>1</DELETE><message>***DONE***</message></root>";
    DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
    Document d = null;
    d = builder.parse(new InputSource(new StringReader(str)));

    MyJaxbObject myJaxUnmarsh = unmarshal.unmarshal(d.getFirstChild(), MyJaxbObject.class).getValue();
    System.out.println(myJaxUnmarsh.getMessage() + " , " + myJaxUnmarsh.getDelete());

    MyJaxbObject myJax = new MyJaxbObject();
    myJax.setDelete(true);
    myJax.setMessage("***DONE***");
    marshal.marshal(myJax, System.out);

最佳答案

使用以下 BooleanIntAdapter 实现:

BooleanIntAdapter

package forum9380680;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class BooleanIntAdapter extends XmlAdapter<Integer, Boolean> {

    @Override
    public Boolean unmarshal(Integer v) throws Exception {
        return v.equals(1);
    }

    @Override
    public Integer marshal(Boolean v) throws Exception {
        if(v) {
            return 1;
        } else {
            return 0;
        }
    }

}

输出

我得到以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <DELETE>1</DELETE>
   <message>***DONE***</message>
</root>

下面是我使用的其余代码:

演示

package forum9380680;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(MyJaxbObject.class);

        MyJaxbObject object = new MyJaxbObject();
        object.setDelete(true);
        object.setMessage("***DONE***");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(object, System.out);
    }

}

MyJaxbObject

package forum9380680;

import java.io.Serializable;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "root")
public class MyJaxbObject implements Serializable
{

    @XmlElement(name = "DELETE")
    @XmlJavaTypeAdapter(BooleanIntAdapter.class)
    private Boolean delete;

    @XmlElement(name = "message")
    private String message;

    public Boolean getDelete() {
        return delete;
    }

    public void setDelete(Boolean delete) {
        this.delete = delete;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

关于jaxb marshall boolean 值作为整数 (0,1) 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9380680/

相关文章:

java - 为 http ://schemas. opengis.net/wfs/1.1.0/wfs.xsd 生成 JAXB 类

java - 为什么由于安全限制,我的 Java/SalesForce 应用程序无法创建 JAXBContext?

objective-c - 将数字列表四舍五入到用户定义的步骤,同时保留它们的总和

Java 老虎机类

java - JAX-RS/JAXB : equals()

c - 某些输入的整数到二进制转换程序失败

带整数的 C++ boolean 值

sql - 具有许多 boolean 变量的模式的最佳实践

boolean - 预期类型 `bool` ,发现类型 `&bool`

web-services - 使用自定义 jaxb 绑定(bind)获取 xs :datetime to Joda time but getting XMLGregorianCalender