Konvertieren Sie XML in JSON mit Jackson

1. Übersicht

In diesem Tutorial erfahren Sie, wie Sie eine XML-Nachricht mit Jackson in JSON konvertieren.

Für Leser, die Jackson noch nicht kennen, sollten Sie sich zunächst mit den Grundlagen vertraut machen.

2. Eine Einführung in Jackson

Wir können uns vorstellen, JSON mit Jackson auf drei verschiedene Arten zu analysieren:

  • Die erste und häufigste ist die Datenbindung mit ObjectMapper
  • Die zweite ist die Zuordnung zu einer Baumdatenstruktur mit TreeTraversingParser und JsonNode
  • Und das dritte ist das Streaming der Baumdatenstruktur per Token mit JsonParser und JsonGenerator

Jetzt unterstützt Jackson auch die ersten beiden für XML-Daten. Lassen Sie uns sehen, wie Jackson uns bei der Konvertierung von einem Format in das andere helfen kann.

3. Abhängigkeiten

Zuerst müssen wir die Abhängigkeit von jackson-databaseind zu unserer pom.xml hinzufügen :

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Diese Bibliothek ermöglicht es uns, die Datenbindungs-API zu verwenden.

Das zweite ist jackson-dataformat-xml, das Jacksons XML-Unterstützung hinzufügt:

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

4. Datenbindung

Datenbindung ist einfach ausgedrückt, wenn wir serialisierte Daten direkt einem Java-Objekt zuordnen möchten.

Um dies zu untersuchen, definieren wir unser XML mit den Eigenschaften " Blume" und " Farbe" :

 Poppy RED 9  

Dies ähnelt dieser Java-Notation:

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

Unser erster Schritt besteht darin, das XML in eine Flower- Instanz zu analysieren . Um das zu tun, lassen Sie uns eine Instanz von XmlMapper , Jacksons XML - Äquivalent für ObjectMapper und verwenden Sie seine Readvalue - Methode:

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

Sobald wir unsere Flower- Instanz haben, möchten wir sie mit dem bekannten ObjectMapper als JSON ausschreiben :

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

Als Ergebnis erhalten wir unser JSON-Äquivalent:

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

5. Baumdurchquerung

Manchmal kann ein direkter Blick auf die Baumstruktur mehr Flexibilität bieten, beispielsweise für den Fall, dass wir keine Zwischenklasse beibehalten oder nur einen Teil der Struktur konvertieren möchten.

Wie wir sehen werden, bringt es jedoch einige Kompromisse mit sich.

Der erste Schritt ähnelt unserem ersten Schritt, wenn wir die Datenbindung verwenden. Dieses Mal verwenden wir jedoch die readTree- Methode:

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

Nachdem wir dies getan haben, haben wir einen JsonNode , der wie erwartet 3 Kinder hat: Name, Farbe und Blütenblätter .

Dann können wir wieder verwenden ObjectMapper , nur unsere Senden JsonNode statt:

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

Das Ergebnis unterscheidet sich geringfügig von unserem letzten Beispiel:

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

Bei sorgfältiger Prüfung können wir feststellen, dass das Blütenblattattribut in eine Zeichenfolge anstelle einer Zahl serialisiert ist! Dies liegt daran, dass readTree den Datentyp nicht ohne explizite Definition ableitet .

5.1. Einschränkungen

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

Beide haben nun den bemerkenswerten Nachteil, dass sich das gesamte XML auf einmal im Speicher befinden muss, um die Konvertierung durchzuführen. Bis Jackson das Streaming der Baumstruktur als Token unterstützt, bleiben wir bei dieser Einschränkung, oder wir müssen einen Blick darauf werfen, wie wir unsere eigene mit etwas wie XMLStreamReader rollen.

7. Fazit

In diesem Tutorial haben wir kurz verschiedene Möglichkeiten kennengelernt, wie Jackson XML-Daten lesen und in JSON schreiben kann. Außerdem haben wir uns kurz mit den Einschränkungen der einzelnen unterstützten Ansätze befasst.

Wie üblich ist der vollständige Quellcode, der dem Tutorial beiliegt, auf GitHub verfügbar.