Convertir XML en JSON à l'aide de Jackson

1. Vue d'ensemble

Dans ce didacticiel, nous verrons comment convertir un message XML en JSON à l'aide de Jackson.

Pour les lecteurs qui découvrent Jackson, pensez d'abord à vous familiariser avec les bases.

2. Une introduction à Jackson

Nous pouvons penser à analyser JSON de trois manières différentes avec Jackson:

  • Le premier et le plus courant est la liaison de données avec ObjectMapper
  • Le second est le mappage à une structure de données arborescente avec TreeTraversingParser et JsonNode
  • Et le troisième est le streaming de la structure de données de l'arborescence par jeton, à l'aide de JsonParser et JsonGenerator

Désormais, Jackson prend également en charge les deux premiers pour les données XML. En tant que tel, voyons comment Jackson peut nous aider à effectuer la conversion d'un format à l'autre.

3. Dépendances

Tout d'abord, nous devons ajouter la dépendance jackson-databind à notre pom.xml :

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Cette bibliothèque va nous permettre d'utiliser l'API de liaison de données.

Le second est jackson-dataformat-xml qui ajoute le support XML de Jackson:

 com.fasterxml.jackson.dataformat jackson-dataformat-xml 2.11.1 

4. Liaison de données

La liaison de données, en termes simples, consiste à mapper des données sérialisées directement à un objet Java.

Pour explorer cela, définissons notre XML avec les propriétés Flower et Color :

 Poppy RED 9  

Ceci est similaire à cette notation Java:

public class Flower { private String name; private Color color; private Integer petals; // getters and setters } public enum Color { PINK, BLUE, YELLOW, RED; }

Notre première étape sera d'analyser le XML dans une instance Flower . Pour ce faire, créons une instance de XmlMapper , l'équivalent XML de Jackson pour ObjectMapper et utilisons sa méthode readValue :

XmlMapper xmlMapper = new XmlMapper(); Flower poppy = xmlMapper.readValue(xml, Flower.class);

Une fois que nous avons notre instance Flower , nous voudrons l'écrire au format JSON en utilisant l' ObjectMapper familier :

ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(poppy);

Et, par conséquent, nous obtenons notre équivalent JSON:

{ "name":"Poppy", "color":"RED", "petals":9 }

5. Traversée des arbres

Parfois, regarder directement la structure arborescente peut offrir plus de flexibilité, comme dans le cas où nous ne voulons pas maintenir une classe intermédiaire ou nous voulons seulement convertir une partie de la structure.

Cependant, comme nous le verrons, cela s'accompagne de quelques compromis.

La première étape est similaire à notre première étape lorsque nous utilisons la liaison de données. Cette fois, cependant, nous utiliserons la méthode readTree :

XmlMapper xmlMapper = new XmlMapper(); JsonNode node = xmlMapper.readTree(xml.getBytes());

Après avoir fait cela, nous aurons un JsonNode qui a 3 enfants, comme prévu: nom, couleur et pétales .

Ensuite, nous pouvons à nouveau utiliser ObjectMapper , en envoyant simplement notre JsonNode à la place:

ObjectMapper jsonMapper = new ObjectMapper(); String json = jsonMapper.writeValueAsString(node);

Maintenant, le résultat est légèrement différent par rapport à notre dernier exemple:

{ "name":"Poppy", "color":"RED", "petals":"9" }

Après une inspection minutieuse, nous pouvons voir que l'attribut pétales est sérialisé dans une chaîne au lieu d'un nombre! En effet, readTree n'infère pas le type de données sans définition explicite.

5.1. Limites

Et, il existe certaines limitations avec la prise en charge de la traversée d'arborescence XML de Jackson:

  • Jackson ne peut pas faire la différence entre un objet et un tableau. Puisque XML manque de structures natives pour distinguer un objet d'une liste d'objets, Jackson rassemblera simplement les éléments répétés en une seule valeur.
  • Et, puisque Jackson souhaite mapper chaque élément XML à un nœud JSON, il ne prend pas en charge le contenu mixte.

Pour ces raisons, la documentation officielle de Jackson recommande de ne pas utiliser de modèles Tree pour analyser XML.

6. Contraintes de mémoire

Maintenant, les deux ont l'inconvénient notable que tout le XML doit être en mémoire à la fois pour effectuer la conversion. Jusqu'à ce que Jackson prenne en charge le streaming de la structure arborescente sous forme de jetons, nous serons coincés avec cette contrainte ou nous devrons jeter un œil à la création de la nôtre avec quelque chose comme XMLStreamReader.

7. Conclusion

Dans ce didacticiel, nous avons brièvement appris différentes manières dont Jackson peut lire des données XML et les écrire dans JSON. Nous avons également examiné rapidement les limites de chaque approche prise en charge.

Comme d'habitude, le code source complet qui accompagne le didacticiel est disponible à l'adresse over sur GitHub.