Java JAXB将布尔值编组为复杂类型
我是JAXB新手,我想做一些我不知道是否可行的事情。我有一个java类要处理,如下所示:Java JAXB将布尔值编组为复杂类型,java,xml,jaxb,boolean,marshalling,Java,Xml,Jaxb,Boolean,Marshalling,我是JAXB新手,我想做一些我不知道是否可行的事情。我有一个java类要处理,如下所示: @XmlAccessorType(XMLAccessType.NONE) public class MyClass { @XmlElement private String a = "x"; @XmlElement private String b = "xx"; @XmlElement private boolean c = true; ... } <?xml ...?
@XmlAccessorType(XMLAccessType.NONE)
public class MyClass {
@XmlElement
private String a = "x";
@XmlElement
private String b = "xx";
@XmlElement
private boolean c = true;
...
}
<?xml ...?>
<MyClass>
<a>x</a>
<b>xx</b>
<c value="true"/>
</MyClass>
并希望XML输出如下所示:
@XmlAccessorType(XMLAccessType.NONE)
public class MyClass {
@XmlElement
private String a = "x";
@XmlElement
private String b = "xx";
@XmlElement
private boolean c = true;
...
}
<?xml ...?>
<MyClass>
<a>x</a>
<b>xx</b>
<c value="true"/>
</MyClass>
x
xx
我想到的一个解决方案是使用布尔包装类使其工作,但我希望避免这种情况,因为它会使我失去使用布尔基元true和false的能力
我们可以在JAXB中这样做吗?类的XML输出是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass>
<a>x</a>
<b>xx</b>
<c>true</c>
</myClass>
然后在布尔c
字段周围需要一个包装器元素。这可以是Boolean
类型,也可以是其他一些自定义类型,其中包含Boolean c
,并用@xmldattribute
标记
示例:
class MyBool {
@XmlAttribute(name="value")
private boolean c = true;
}
@XmlAccessorType(XmlAccessType.NONE)
class MyClass {
@XmlElement
private String a = "x";
@XmlElement
private String b = "xx";
@XmlElement
private MyBool c = new MyBool();
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass>
<a>x</a>
<b>xx</b>
<c value="true"/>
</myClass>
输出:
class MyBool {
@XmlAttribute(name="value")
private boolean c = true;
}
@XmlAccessorType(XmlAccessType.NONE)
class MyClass {
@XmlElement
private String a = "x";
@XmlElement
private String b = "xx";
@XmlElement
private MyBool c = new MyBool();
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass>
<a>x</a>
<b>xx</b>
<c value="true"/>
</myClass>
但是,它将被呈现为包装类的一个属性,在本例中,包装类是MyClass
,因此输出将是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass value="true">
<a>x</a>
<b>xx</b>
</myClass>
x
xx
利用XmlAdapter
您可以创建一个XmlAdapter
,以获得所需的行为。XmlAdapter
将域对象转换为另一种类型以进行编组和解编组
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class BooleanAdapter extends XmlAdapter<BooleanAdapter.AdaptedBoolean, Boolean> {
public static class AdaptedBoolean {
@XmlAttribute
public boolean value;
}
@Override
public Boolean unmarshal(AdaptedBoolean adaptedBoolean) throws Exception {
return adaptedBoolean.value;
}
@Override
public AdaptedBoolean marshal(Boolean v) throws Exception {
AdaptedBoolean adaptedBoolean = new AdaptedBoolean();
adaptedBoolean.value = v;
return adaptedBoolean;
}
}
在搜索(“jaxb扁平元素”和相关内容)之后,我怀疑这可以通过
@XmlJavaTypeAdapter
()实现,但我对jaxb的了解还不够确定,所以我将此建议作为一个注释而不是答案。@bMail-以下是XmlAdapter
方法的外观:感谢您的回答,我确实尝试过使用XMLAdapter,但不知道可以这样使用它。我要试试你的解决办法:)你好,新年快乐!我测试了你的解决方案,效果很好。非常感谢,祝你有一个愉快的一天^^我不想更改我的布尔类,因为它在许多其他类中使用,我失去了使用布尔类的能力,比如“boolean a=true”。如果我找不到另一个,我就试试你的解决办法。感谢您的回复:)