java json jaxb moxy

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"; }