xmlmapper new jacksonxmlelementwrapper java json xml jackson

java - new - ¿Cómo convertir XML a JSON usando solo Jackson?



xmlmapper jackson (2)

¿Hay alguna forma de convertir xml a json sin usar ninguna API de terceros?

Si eres práctico, no, no lo es.

El paso de analizar el XML se puede realizar utilizando API que son parte de Java SE. Sin embargo, pasar del XML analizado (por ejemplo, un DOM) a JSON requiere una biblioteca de soporte JSON, y Java SE no incluye uno.

(En teoría, podrías escribir una biblioteca así, pero ¿de qué sirve hacer eso?)

Utilicé a Jackson, pero para esto necesito crear POJO.

@Cassio señala que Jackson le permite hacer esta traducción sin escribir POJO. Alternativamente, mire otras API de JSON (de terceros) para Java; ver http://www.json.org para una lista de alternativas. Algunos de los más simples no implican definir POJOs

Recibo una respuesta del servidor como XML. Pero necesito mostrar esto en formato JSON.

¿Hay alguna forma de convertirlo sin una API de terceros? Utilicé a Jackson, pero para esto necesito crear POJO.

La respuesta del servidor es así:

<?xml version=''1.0''?> <errors><error><status>400</status><message>The field ''quantity'' is invalid.</message><details><invalid_reason>The quantity specified is greater than the quantity of the product that is available to ship.</invalid_reason><available_quantity>0</available_quantity><order_product_id>12525</order_product_id></details></error></errors>


Usando Jackson 2.x

Puedes hacer eso con Jackson y no se requieren POJO para eso:

String xml = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>/n" + "<errors>/n" + " <error>/n" + " <status>400</status>/n" + " <message>The field ''quantity'' is invalid.</message>/n" + " <details>/n" + " <invalid_reason>The quantity specified is greater than the quantity of the product that is available to ship.</invalid_reason>/n" + " <available_quantity>0</available_quantity>/n" + " <order_product_id>12525</order_product_id>/n" + " </details>/n" + " </error>/n" + "</errors>"; XmlMapper xmlMapper = new XmlMapper(); JsonNode node = xmlMapper.readTree(xml.getBytes()); ObjectMapper jsonMapper = new ObjectMapper(); String json = jsonMapper.writeValueAsString(node);

Se requieren las siguientes dependencias:

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.8.2</version> </dependency>

Tenga en cuenta las limitaciones de XmlMapper establecidas en la documentación :

El Modelo de árbol solo se admite de manera limitada: específicamente, las matrices y Collections Java se pueden escribir, pero no se pueden leer, ya que no es posible distinguir matrices y objetos sin información adicional.

Usando JSON.org

También puedes hacerlo con JSON.org:

String xml = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>/n" + "<errors>/n" + " <error>/n" + " <status>400</status>/n" + " <message>The field ''quantity'' is invalid.</message>/n" + " <details>/n" + " <invalid_reason>The quantity specified is greater than the quantity of the product that is available to ship.</invalid_reason>/n" + " <available_quantity>0</available_quantity>/n" + " <order_product_id>12525</order_product_id>/n" + " </details>/n" + " </error>/n" + "</errors>"; String json = XML.toJSONObject(xml).toString();

Se requiere la siguiente dependencia:

<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20160810</version> </dependency>