Converti XML in JSON usando Jackson

1. Panoramica

In questo tutorial vedremo come convertire un messaggio XML in JSON usando Jackson.

Per i lettori nuovi a Jackson, considera prima di prendere familiarità con le basi.

2. Un'introduzione a Jackson

Possiamo pensare di analizzare JSON in tre modi diversi con Jackson:

  • Il primo e più comune è il data binding con ObjectMapper
  • Il secondo è il mapping a una struttura dati ad albero con TreeTraversingParser e JsonNode
  • E il terzo è lo streaming della struttura dei dati ad albero per token, utilizzando JsonParser e JsonGenerator

Ora, Jackson supporta anche i primi due per i dati XML. Come tale, vediamo come Jackson può aiutarci a fare la conversione da un formato all'altro.

3. Dipendenze

Innanzitutto, dobbiamo aggiungere la dipendenza jackson-databind al nostro pom.xml :

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Questa libreria ci consentirà di utilizzare l'API di associazione dei dati.

Il secondo è jackson-dataformat-xml che aggiunge il supporto XML di Jackson:

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

4. Associazione dati

Il data binding, in poche parole, è quando vogliamo mappare i dati serializzati direttamente su un oggetto Java.

Per esplorarlo, definiamo il nostro XML con le proprietà Flower e Color :

 Poppy RED 9  

Questo è simile a questa notazione Java:

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

Il nostro primo passo sarà analizzare l'XML in un'istanza di Flower . Per fare ciò, creiamo un'istanza di XmlMapper , l'equivalente XML di Jackson per ObjectMapper e usiamo il suo metodo readValue :

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

Una volta che abbiamo la nostra istanza Flower , vorremo scriverla come JSON utilizzando il familiare ObjectMapper :

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

Di conseguenza, otteniamo il nostro equivalente JSON:

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

5. Tree Traversal

A volte, guardare direttamente la struttura ad albero può offrire una maggiore flessibilità, come nel caso in cui non vogliamo mantenere una classe intermedia o vogliamo solo convertire una parte della struttura.

Tuttavia, come vedremo, presenta alcuni compromessi.

Il primo passaggio è simile al nostro primo passaggio quando utilizziamo il data binding. Questa volta, però, useremo il metodo readTree :

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

Fatto ciò, avremo un JsonNode che ha 3 figli, come ci aspettavamo: nome, colore e petali .

Quindi, possiamo nuovamente utilizzare ObjectMapper , inviando semplicemente il nostro JsonNode :

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

Ora, il risultato è leggermente diverso rispetto al nostro ultimo esempio:

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

Dopo un'attenta ispezione, possiamo vedere che l'attributo petali è serializzato in una stringa invece che in un numero! Questo perché readTree non deduce il tipo di dati senza una definizione esplicita.

5.1. Limitazioni

E ci sono alcune limitazioni con il supporto dell'attraversamento dell'albero XML di Jackson:

  • Jackson non può distinguere tra un oggetto e un array. Poiché XML non dispone di strutture native per distinguere un oggetto da un elenco di oggetti, Jackson raccoglierà semplicemente gli elementi ripetuti in un singolo valore.
  • Inoltre, poiché Jackson vuole mappare ogni elemento XML a un nodo JSON, non supporta il contenuto misto.

Per questi motivi, i documenti ufficiali di Jackson sconsigliano di utilizzare i modelli Tree per analizzare XML.

6. Vincoli di memoria

Ora, entrambi hanno il notevole svantaggio che l'intero XML deve essere in memoria contemporaneamente per eseguire la conversione. Fino a quando Jackson non supporterà lo streaming della struttura ad albero come token, rimarremo bloccati con questo vincolo o dovremo dare un'occhiata al nostro roll con qualcosa come XMLStreamReader.

7. Conclusione

In questo tutorial, abbiamo brevemente imparato diversi modi in cui Jackson può leggere i dati XML e scriverli in JSON. Inoltre, abbiamo esaminato rapidamente i limiti di ogni approccio supportato.

Come al solito, il codice sorgente completo che accompagna il tutorial è disponibile su GitHub.