Konverter XML til JSON ved hjælp af Jackson

1. Oversigt

I denne vejledning ser vi, hvordan du konverterer en XML-besked til JSON ved hjælp af Jackson.

For læsere, der er nye i Jackson, skal du først overveje at blive fortrolig med det grundlæggende.

2. En introduktion til Jackson

Vi kan tænke på at analysere JSON på tre forskellige måder med Jackson:

  • Den første og mest almindelige er databinding med ObjectMapper
  • Den anden er kortlægning til en træstatastruktur med TreeTraversingParser og JsonNode
  • Og den tredje streamer træets datastruktur ved hjælp af token JsonParser og JsonGenerator

Nu understøtter Jackson også de to første til XML-data. Lad os som sådan se, hvordan Jackson kan hjælpe os med at konvertere fra det ene format til det andet.

3. Afhængigheder

Først skal vi tilføje jackson-databind afhængighed af vores pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Dette bibliotek vil give os mulighed for at bruge databindings-API'en.

Den anden er jackson-dataformat-xml som tilføjer Jacksons XML-understøttelse:

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

4. Databinding

Databinding, enkelt sagt, er når vi vil kortlægge serielle data direkte til et Java-objekt.

For at udforske dette, lad os definere vores XML med Blomst og Farve ejendomme:

 Valmue RØD 9 

Dette svarer til denne Java-notation:

offentlig klasse blomst {privat strengnavn; privat farve farve; private heltal kronblade; // getters and setters} public enum Color {PINK, BLUE, GUL, RØD; }

Vores første skridt vil være at analysere XML i en Blomst eksempel. For at gøre det, lad os oprette en forekomst af XmlMapper, Jacksons XML-ækvivalent for ObjectMapper og brug dens readValue metode:

XmlMapper xmlMapper = ny XmlMapper (); Blomstervalmue = xmlMapper.readValue (xml, Flower.class);

Når vi har vores Blomst For eksempel vil vi skrive det ud som JSON ved hjælp af det velkendte ObjectMapper:

ObjectMapper-kortlægger = ny ObjectMapper (); String json = mapper.writeValueAsString (valmue);

Og som et resultat får vi vores JSON-ækvivalent:

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

5. Træovergange

Til tider kan det at se direkte på træstrukturen tilbyde mere fleksibilitet, som i tilfælde af at vi ikke ønsker at opretholde en mellemklasse, eller vi kun vil konvertere en del af strukturen.

Skønt, som vi vil se, kommer det med nogle kompromiser.

Det første trin svarer til vores første trin, når vi bruger databinding. Denne gang bruger vi dog readTree metode:

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

Når vi har gjort dette, har vi en JsonNode som har 3 børn, som vi forventede: navn, farve, og kronblade.

Derefter kan vi igen bruge ObjectMapperbare sende vores JsonNode i stedet:

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

Nu er resultatet lidt anderledes sammenlignet med vores sidste eksempel:

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

Efter omhyggelig inspektion kan vi se, at attributten for kronblade er serieliseret i en streng i stedet for et tal!Dette er fordi readTree udleder ikke datatypen uden en eksplicit definition.

5.1. Begrænsninger

Og der er visse begrænsninger med Jacksons understøttelse af XML-træ gennemgående:

  • Jackson kan ikke skelne mellem et objekt og en matrix. Da XML mangler oprindelige strukturer til at skelne et objekt fra en liste over objekter, samler Jackson simpelthen gentagne elementer i en enkelt værdi.
  • Og da Jackson ønsker at kortlægge hvert XML-element til en JSON-node, understøtter det ikke blandet indhold.

Af disse grunde anbefaler den officielle Jackson docs, at du ikke bruger Tree-modeller til at analysere XML.

6. Hukommelsesbegrænsninger

Nu har begge disse den bemærkelsesværdige ulempe, at hele XML skal være i hukommelsen på én gang for at udføre konverteringen. Indtil Jackson understøtter streaming af træstrukturen som tokens, vil vi sidde fast med denne begrænsning, eller vi bliver nødt til at se på at rulle vores egne med noget som XMLStreamReader.

7. Konklusion

I denne vejledning lærte vi kort forskellige måder, hvorpå Jackson kan læse XML-data og skrive dem til JSON. Vi kiggede også hurtigt på begrænsningerne ved hver understøttet tilgang.

Som sædvanlig er den fulde kildekode, der ledsager vejledningen, tilgængelig på GitHub.