java - Evite la creación de tipo/valor de contenedor de objeto en MOXy(JAXB+JSON)
(1)
Estoy usando MOXy 2.6 (JAXB + JSON).
Quiero que ObjectElement y StringElement se organicen de la misma manera, pero MOXy crea un objeto contenedor cuando los campos se escriben como Objeto.
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();
}
}
Al lanzar Demo.java , aquí está la salida ...
ObjectElement:
{"testVar":{"type":"string","value":"testValue"}}
StringElement:
{"testVar":"testValue"}
¿Cómo configurar MOXy / JaxB para hacer que ObjectElement se presente como objeto StringElement? ¿Cómo evitar la creación de contenedor de objetos con propiedades de "tipo" y "valor" ?
puede usar la Anotación javax.xml.bind.annotation.XmlAttribute
. Esto hará que ObjectElement y StringElement tengan el mismo resultado.
Vea el siguiente ejemplo:
import javax.xml.bind.annotation.XmlAttribute;
public class ObjectElement {
@XmlAttribute
public Object testVar = "testValue";
}
He utilizado la siguiente clase de prueba para verificar el comportamiento correcto.
EDIT después de que se actualizó la pregunta:
Si es posible. En lugar de usar XmlAttribute como antes, cambié a javax.xml.bind.annotation.XmlElement
en combinación con un atributo de tipo.
La clase ahora está declarada como:
public class ObjectElement {
@XmlElement(type = String.class)
public Object testVar = "testValue";
}