online convertir convert classes java xml json pojo

convertir - xml to java converter



¿Hay una biblioteca para convertir los POJO de Java a y desde JSON y XML? (10)

Creo que puede estar buscando algo similar a lo que está aquí: http://www.json.org/java/

Tengo un gráfico de objetos que me gustaría convertir hacia y desde JSON y XML, con el propósito de crear una API de estilo REST. Me sorprende que alguien ya haya hecho esto, pero una búsqueda rápida con Google y Stack Overflow no revela nada.

¿Alguien sabe de una biblioteca adecuada (Apache o licencia equivalente preferida) para hacer esto?


Eche un vistazo a la biblioteca de Genson http://code.google.com/p/genson/wiki/GettingStarted .

Es fácil de usar, de alto rendimiento y fue diseñado teniendo en cuenta la extensión. En realidad hace conversión json / java pero no xml. Sin embargo, se puede agregar compatibilidad con XML en una versión futura.

Lo estoy usando en aplicaciones web y servicios web REST en jersey, pero también en algunos casos para almacenar objetos en su forma json en una base de datos.

Ah y está bajo la licencia Apache 2.0.


Hay casi literalmente cientos. Mis favoritos son GSON para POJO <-> JSON y castor-xml para POJO <-> XML.

Como bono, ambos están licenciados bajo las licencias de estilo Apache License 2.0.


Lo último que vi en el sitio web, XStream hará ambas cosas. Es compatible con XML y JSON como objetivos de serialización.


Para POJO a XML, sugiero usar JAXB (también hay otras bibliotecas, como XStream, por ejemplo, pero JAXB está estandarizado).

Para JSON, no sé nada, pero si desea implementar una API RESTful, es posible que le interese JSR-311 que define una API del lado del servidor para las API RESTful y Jersey , que es su implementación de referencia.


Personalmente me gustaría abordar los dos por separado; y para convertir JSON <-> XML a través de JSON <-> Pojo <-> XML.

Con eso: Java <-> POJO con JAXB ( http://jaxb.dev.java.net ; también se incluye con JDK 1.6) con anotaciones (XStream también está bien); y para JSON, ObjectMapper de Jackson ( http://jackson.codehaus.org/Tutorial ). Funciona bien con Jersey, y lo uso yo mismo (la versión actual de Jersey no incluye el enlace completo de datos Pojo de forma predeterminada, pero lo hará en un futuro próximo)

Realmente no usaría ninguna de las bibliotecas XML para producir "json": XStream y JAXB / Jettison pueden producir una especie de JSON, pero usan convenciones feas que son bastante poco intuitivas.

EDITAR (18 de julio de 2011): Jackson en realidad tiene una extensión llamada " jackson-xml-databind " que puede leer / escribir XML, similar a JAXB. Por lo tanto, se puede utilizar tanto para JSON como para XML, desde / hacia POJOs.


Utilice Xstream http://x-stream.github.io/ para xml y JSON http://www.json.org/java/ para JSON. No creo que haya una biblioteca que haga ambas cosas.

O bien, escriba un contenedor que delegue en los renderizadores XStream / JSON en función de lo que desee.


Json-lib está licenciado bajo la licencia Apache 2.0.

También puede transformar objetos JSON a XML, pero primero necesitaría convertir sus POJO a JSON.



Nota: Soy el líder de EclipseLink JAXB (MOXy) y un miembro del grupo de expertos JAXB (JSR-222) .

EclipseLink JAXB (MOXy) admite la asignación de un solo modelo de objeto a XML y JSON con los mismos metadatos:

Información de licencia

MODELO DE DOMINIO

A continuación se muestra el modelo de dominio que utilizaremos para este ejemplo. Para este ejemplo, solo estoy usando las anotaciones JAXB (JSR-222) estándar que están disponibles en el JDK / JRE desde Java SE 6.

Cliente

package forum658936; import java.util.List; import javax.xml.bind.annotation.*; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Customer { String firstName; @XmlElement(nillable=true) String lastName; @XmlElement(name="phone-number") List<PhoneNumber> phoneNumbers; }

Número de teléfono

package forum658936; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class PhoneNumber { @XmlAttribute int id; @XmlValue String number; }

jaxb.properties

Para especificar MOXy como su proveedor JAXB, debe incluir un archivo llamado jaxb.properties en el mismo paquete que su modelo de dominio con la siguiente entrada (consulte: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html ).

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

XML

input.xml

Este es el XML que nuestro código de demostración leerá y convertirá a objetos de dominio.

<?xml version="1.0" encoding="UTF-8"?> <customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <firstName>Jane</firstName> <lastName xsi:nil="true"/> <phone-number id="123">555-1234</phone-number> </customer>

Cosas a tener en cuenta sobre el XML:

JSON

Salida

A continuación se muestra el JSON que se generó al ejecutar el código de demostración.

{ "firstName" : "Jane", "lastName" : null, "phone-number" : [ { "id" : 123, "value" : "555-1234" } ] }

Cosas a tener en cuenta sobre el JSON:

  • El valor null se utiliza para representar que el lastName es nulo. No hay presencia del xsi:nil .
  • La recopilación de números de teléfono es de tamaño 1 y está correctamente encuadernada entre corchetes. Muchas bibliotecas tratan incorrectamente las colecciones de tamaño 1 como objetos JSON.
  • La property de tipo int se ha ordenado correctamente sin comillas.
  • En la representación de XML, el id era un atributo, pero en la representación de JSON no es necesario que esté especialmente representado.

CÓDIGO DEMO

En el siguiente código de demostración, convertiremos un documento XML en objetos y luego convertiremos esas mismas instancias a JSON.

Manifestación

MOXy no solo interpreta las anotaciones JAXB, es una implementación JAXB, por lo que se utilizan las API de tiempo de ejecución JAXB estándar. El enlace JSON se habilita especificando MOX y especifica las propiedades en el Marshaller .

package forum658936; import java.io.File; import javax.xml.bind.*; import org.eclipse.persistence.jaxb.MarshallerProperties; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Customer.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); File xml = new File("src/forum658936/input.xml"); Customer customer = (Customer) unmarshaller.unmarshal(xml); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false); marshaller.marshal(customer, System.out); } }