XML in Jackson mit Jackson konvertieren

Konvertieren Sie XML in JSON mit Jackson

1. Überblick

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 zuerst mitthe basicsvertraut machen.

2. Eine Einführung in Jackson

Wir können mit Jackson auf drei verschiedene Arten über das Parsen von JSON nachdenken:

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 vonjackson-databindzu unserenpom.xmlhinzufügen:


    com.fasterxml.jackson.core
    jackson-databind
    2.9.7

Mit dieser Bibliothek können wir die Datenbindungs-API verwenden.

Das zweite istjackson-dataformat-xml, wodurch Jacksons XML-Unterstützung hinzugefügt wird:


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

4. Datenbindung

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

Um dies zu untersuchen,let’s define our XML with Flower and Color properties:


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

Our first step will be to parse the XML into a Flower instance. Erstellen Sie dazu eine Instanz vonXmlMapper, Jacksons XML-Äquivalent fürObjectMapper, und verwenden Sie die MethodereadValue :

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

Sobald wir unsereFlower-Instanz haben, möchten wir sie mit den bekanntenObjectMapper 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 wenn wir keine Zwischenklasse beibehalten oder nur einen Teil der Struktur konvertieren möchten.

Wie wir sehen werden, gibt es jedoch einige Kompromisse.

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

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

Nachdem wir dies getan haben, haben wir einJsonNode mit 3 Kindern, wie wir erwartet hatten:name, color, undpetals.

Dann können wir wiederObjectMapper verwenden und nur unserJsonNode instead senden:

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, dassreadTree den Datentyp ohne explizite Definition nicht ableitet.

5.1. Einschränkungen

Die Unterstützung für das Durchlaufen von XML-Bäumen von Jackson unterliegt bestimmten Einschränkungen:

  • Jackson cannot differentiate between an Object and an Array. Da XML keine nativen Strukturen aufweist, um ein Objekt von einer Liste von Objekten zu unterscheiden, fasst Jackson wiederholte Elemente einfach zu einem einzigen Wert zusammen.

  • Da Jackson jedes XML-Element einem JSON-Knoten zuordnen möchte, werden gemischte Inhalte nicht unterstützt.

6. Speicherbeschränkungen

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. 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 eigenen mit so etwas wieXMLStreamReader. rollen

7. Fazit

In diesem Tutorial haben wir kurz verschiedene Methoden kennengelernt, mit denen 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 Lernprogramm beiliegt,over on GitHub verfügbar.