JAXB将布尔编组为复杂类型

时间:2014-12-18 16:05:03

标签: 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输出如下:

<?xml ...?>
<MyClass>
    <a>x</a>
    <b>xx</b>
    <c value="true"/>
</MyClass>

我想到的一个解决方案是使用布尔包装类来使其工作,但我想避免这种情况,因为它使我无法使用布尔原语true,false。

我们可以在JAXB中这样做吗?

2 个答案:

答案 0 :(得分:3)

利用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;
    }

}

使用XmlAdapter

要使用XmlAdapter,您的映射字段必须是Boolean类型,而不是boolean。如果您愿意,您的访问者方法仍然可以是boolean

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

@XmlAccessorType(XmlAccessType.NONE)
public class MyClass {
    @XmlElement
    private String a = "x";
    @XmlElement
    private String b = "xx";

    @XmlElement
    @XmlJavaTypeAdapter(BooleanAdapter.class)
    private Boolean c = true;

    public boolean getC() {
        return c;
    }

    public void setC(boolean c) {
        this.c = c;
    }
}

答案 1 :(得分:0)

您班级的XML输出是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass>
    <a>x</a>
    <b>xx</b>
    <c>true</c>
</myClass>

如果您希望boolean值导致

<c value="true" />

然后你需要boolean c字段周围的包装元素。这可以是Boolean类型或其中包含boolean c的其他自定义类型,并标有@XmlAttribute

示例:

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>

注意:

如果您不想使用包装器,仍然可以使用boolean c注释@XmlAttribute,如下所示:

@XmlAttribute(name="value")
private boolean c = true;

但是它将呈现为包装器类的属性,在本例中为MyClass,因此输出将为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myClass value="true">
    <a>x</a>
    <b>xx</b>
</myClass>