我的问题看起来很简单,但我无法在 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/