Convertir XML en JSON avec Jackson

Convertir XML en JSON avec Jackson

1. Vue d'ensemble

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

Pour les lecteurs novices dans Jackson, envisagez de vous familiariser d'abord avecthe basics.

2. Une introduction à Jackson

Nous pouvons envisager d’analyser JSON de trois manières différentes avec Jackson:

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. Les dépendances

Tout d'abord, nous devons ajouter la dépendancejackson-databind à nospom.xml:


    com.fasterxml.jackson.core
    jackson-databind
    2.9.7

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

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


    com.fasterxml.jackson.dataformat
    jackson-dataformat-xml
    2.9.7

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,let’s define our XML with Flower and Color properties:


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

Our first step will be to parse the XML into a Flower instance. Pour ce faire, créons une instance deXmlMapper, l'équivalent XML de Jackson pourObjectMapper et utilisons sa méthodereadValue :

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

Une fois que nous aurons notre instanceFlower, nous voudrons l'écrire au format JSON en utilisant lesObjectMapper familiers:

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

Et, en conséquence, nous obtenons notre équivalent JSON:

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

5. Traversée d'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 comporte quelques compromis.

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

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

Après avoir fait cela, nous aurons unJsonNode qui a 3 enfants, comme prévu:name, color, etpetals.

Ensuite, nous pouvons à nouveau utiliserObjectMapper, en envoyant simplement notreJsonNode instead:

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

De plus, la prise en charge de la traversée d'arborescence XML de Jackson présente certaines limitations:

  • Jackson cannot differentiate between an Object and an Array. Puisque XML ne dispose pas 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.

6. Contraintes de mémoire

Now, both of these have the notable downside that the entire XML needs to be in memory at once in order to perform the conversion. Jusqu'à ce que Jackson prenne en charge la diffusion en continu 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 commeXMLStreamReader.

7. Conclusion

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

Comme d'habitude, le code source complet qui accompagne le tutoriel est disponibleover on GitHub.