Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB将布尔值编组为复杂类型_Java_Xml_Jaxb_Boolean_Marshalling - Fatal编程技术网

Java JAXB将布尔值编组为复杂类型

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 ...?

我是JAXB新手,我想做一些我不知道是否可行的事情。我有一个java类要处理,如下所示:

@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”。如果我找不到另一个,我就试试你的解决办法。感谢您的回复:)