1. Información general
En este tutorial, veremos cómo convertir un mensaje XML a JSON usando Jackson.
Para los lectores nuevos en Jackson, considere familiarizarse primero con los conceptos básicos.
2. Introducción a Jackson
Podemos pensar en analizar JSON de tres formas diferentes con Jackson:
- El primero y más común es el enlace de datos con ObjectMapper
- El segundo es el mapeo a una estructura de datos de árbol con TreeTraversingParser y JsonNode
- Y el tercero es transmitir la estructura de datos del árbol por token, utilizando JsonParser y JsonGenerator
Ahora, Jackson también admite los dos primeros para datos XML. Como tal, veamos cómo Jackson puede ayudarnos a hacer la conversión de un formato a otro.
3. Dependencias
Primero, necesitamos agregar la dependencia jackson-databind a nuestro pom.xml :
com.fasterxml.jackson.core jackson-databind 2.11.1
Esta biblioteca nos permitirá utilizar la API de enlace de datos.
El segundo es jackson-dataformat-xml, que agrega el soporte XML de Jackson:
com.fasterxml.jackson.dataformat jackson-dataformat-xml 2.11.1
4. Enlace de datos
El enlace de datos, en pocas palabras, es cuando queremos mapear datos serializados directamente a un objeto Java.
Para explorar esto, definamos nuestro XML con las propiedades Flor y Color :
Poppy RED 9
Esto es similar a esta notación de Java:
public class Flower { private String name; private Color color; private Integer petals; // getters and setters } public enum Color { PINK, BLUE, YELLOW, RED; }
Nuestro primer paso será analizar el XML en una instancia de Flower . Para hacer eso, creemos una instancia de XmlMapper , el equivalente XML de Jackson para ObjectMapper y usemos su método readValue :
XmlMapper xmlMapper = new XmlMapper(); Flower poppy = xmlMapper.readValue(xml, Flower.class);
Una vez que tengamos nuestra instancia de Flower , querremos escribirla como JSON usando el conocido ObjectMapper :
ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(poppy);
Y, como resultado, obtenemos nuestro equivalente JSON:
{ "name":"Poppy", "color":"RED", "petals":9 }
5. Cruce de árboles
A veces, mirar directamente a la estructura del árbol puede ofrecer más flexibilidad, como en el caso de que no queramos mantener una clase intermedia o solo queramos convertir una parte de la estructura.
Aunque, como veremos, viene con algunas compensaciones.
El primer paso es similar a nuestro primer paso cuando usamos el enlace de datos. Esta vez, sin embargo, usaremos el método readTree :
XmlMapper xmlMapper = new XmlMapper(); JsonNode node = xmlMapper.readTree(xml.getBytes());
Una vez hecho esto, tendremos un JsonNode que tiene 3 hijos, como esperábamos: nombre, color y pétalos .
Luego, podemos usar ObjectMapper nuevamente , simplemente enviando nuestro JsonNode en su lugar:
ObjectMapper jsonMapper = new ObjectMapper(); String json = jsonMapper.writeValueAsString(node);
Ahora, el resultado es ligeramente diferente en comparación con nuestro último ejemplo:
{ "name":"Poppy", "color":"RED", "petals":"9" }
Tras una inspección cuidadosa, podemos ver que el atributo de pétalos se serializa en una cadena en lugar de un número. Esto se debe a que readTree no infiere el tipo de datos sin una definición explícita.
5.1. Limitaciones
And, there are certain limitations with Jackson's XML tree traversal support:
- Jackson cannot differentiate between an Object and an Array. Since XML lacks native structures to distinguish an object from a list of objects, Jackson will simply collate repeated elements into a single value.
- And, since Jackson wants to map each XML element to a JSON node, it doesn't support mixed content.
For these reasons, the official Jackson docs recommend against using Tree models to parse XML.
6. Memory Constraints
Ahora, ambos tienen la desventaja notable de que todo el XML debe estar en la memoria a la vez para realizar la conversión. Hasta que Jackson admita la transmisión de la estructura de árbol como tokens, estaremos atrapados con esta restricción o tendremos que echar un vistazo a la nuestra con algo como XMLStreamReader.
7. Conclusión
En este tutorial, aprendimos brevemente diferentes formas en las que Jackson puede leer datos XML y escribirlos en JSON. Además, echamos un vistazo rápido a las limitaciones de cada enfoque admitido.
Como de costumbre, el código fuente completo que acompaña al tutorial está disponible en GitHub.