避免在MOXy中创建对象包装器类型/值(JAXB + JSON)

时间:2015-06-04 14:31:51

标签: java json jaxb moxy

我正在使用MOXy 2.6(JAXB + JSON)。

我希望以相同的方式编组ObjectElement和StringElement,但是当字段被输入为Object时,MOXy会创建包装器对象。

ObjectElement.java

public class ObjectElement {
    public Object testVar = "testValue";
}

StringElement.java

public class StringElement {
    public String testVar = "testValue";
}

Demo.java

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

import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.oxm.MediaType;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContextFactory.createContext(new Class[] { ObjectElement.class, StringElement.class }, null);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);

        System.out.println("ObjectElement:");
        ObjectElement objectElement = new ObjectElement();
        marshaller.marshal(objectElement, System.out);
        System.out.println();

        System.out.println("StringElement:");
        StringElement stringElement = new StringElement();
        marshaller.marshal(stringElement, System.out);
        System.out.println();
    }

}

启动 Demo.java 时,这是输出...

ObjectElement:
{"testVar":{"type":"string","value":"testValue"}}
StringElement:
{"testVar":"testValue"}

如何配置MOXy / JaxB以使ObjectElement呈现为StringElement对象?如何避免使用“type”“value”属性创建对象包装器?

1 个答案:

答案 0 :(得分:2)

您可以使用注释javax.xml.bind.annotation.XmlAttribute。这将使ObjectElement和StringElement呈现相同的输出。

请参阅以下示例:

import javax.xml.bind.annotation.XmlAttribute;

public class ObjectElement {
    @XmlAttribute
    public Object testVar = "testValue";
}

我已使用以下test class来验证正确的行为。

问题更新后编辑:

是的,这是可能的。我没有像以前那样使用XmlAttribute,而是结合了type属性切换到javax.xml.bind.annotation.XmlElement

该类现在声明为:

public class ObjectElement {
  @XmlElement(type = String.class)
  public Object testVar = "testValue";
}