Konverter XML til JSON ved hjelp av Jackson

1. Oversikt

I denne opplæringen vil vi se hvordan du konverterer en XML-melding til JSON ved hjelp av Jackson.

For lesere som ikke er nye i Jackson, bør du først først bli kjent med det grunnleggende.

2. En introduksjon til Jackson

Vi kan tenke på å analysere JSON på tre forskjellige måter med Jackson:

  • Det første og mest vanlige er databinding med ObjectMapper
  • Den andre er kartlegging til en tredatastruktur med TreeTraversingParser og JsonNode
  • Og den tredje er å streame tredatastrukturen ved hjelp av token JsonParser og JsonGenerator

Nå støtter Jackson også de to første for XML-data. La oss som sådan se hvordan Jackson kan hjelpe oss med å gjøre konverteringen fra det ene formatet til det andre.

3. Avhengigheter

Først må vi legge til jackson-databind avhengighet til vår pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Dette biblioteket vil tillate oss å bruke databindings-API.

Det andre er jackson-dataformat-xml som legger til Jacksons XML-støtte:

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

4. Databinding

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

For å utforske dette, la oss definere vår XML med Blomst og Farge eiendommer:

 Valmue RØD 9 

Dette ligner på denne Java-notasjonen:

offentlig klasse Flower {private String name; privat farge farge; private Integer petals; // getters and setters} public enum Color {PINK, BLUE, GUL, RØD; }

Vårt første skritt vil være å analysere XML i en Blomst forekomst. For å gjøre det, la oss lage en forekomst av XmlMapper, Jacksons XML-ekvivalent for ObjectMapper og bruk dens readValue metode:

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

Når vi har fått vår Blomst For eksempel vil vi skrive det ut som JSON ved hjelp av det kjente ObjectMapper:

ObjectMapper mapper = ny ObjectMapper (); String json = mapper.writeValueAsString (valmue);

Og som et resultat får vi vår JSON-ekvivalent:

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

5. Tregjennomgang

Noen ganger kan det å se direkte på trestrukturen tilby mer fleksibilitet, som i tilfelle at vi ikke ønsker å opprettholde en mellomklasse, eller bare vil konvertere en del av strukturen.

Skjønt, som vi får se, kommer det med noen kompromisser.

Det første trinnet ligner på vårt første trinn når vi bruker databinding. Denne gangen bruker vi imidlertid readTree metode:

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

Etter å ha gjort dette, vil vi ha en JsonNode som har 3 barn, som vi forventet: navn, farge, og kronblad.

Deretter kan vi igjen bruke ObjectMapperbare å sende vår JsonNode i stedet:

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

Nå er utfallet litt annerledes sammenlignet med vårt siste eksempel:

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

Ved nøye inspeksjon kan vi se at kronbladets attributt er seriell i en streng i stedet for et tall!Dette er fordi readTree utleder ikke datatypen uten en eksplisitt definisjon.

5.1. Begrensninger

Og det er visse begrensninger med Jacksons støtte for XML-tregjennomgang:

  • Jackson kan ikke skille mellom et objekt og et array. Siden XML mangler opprinnelige strukturer for å skille et objekt fra en liste over objekter, vil Jackson ganske enkelt samle gjentatte elementer i en enkelt verdi.
  • Siden Jackson ønsker å kartlegge hvert XML-element til en JSON-node, støtter det ikke blandet innhold.

Av disse grunner anbefaler de offisielle Jackson-dokumentene å ikke bruke Tree-modeller til å analysere XML.

6. Minnebegrensninger

Nå har begge disse den bemerkelsesverdige ulempen at hele XML må være i minnet samtidig for å kunne utføre konverteringen. Inntil Jackson støtter streaming av trestrukturen som tokens, vil vi bli sittende fast med denne begrensningen, eller vi må ta en titt på å rulle vår egen med noe sånt XMLStreamReader.

7. Konklusjon

I denne opplæringen lærte vi kort forskjellige måter Jackson kan lese XML-data på og skrive dem til JSON. Vi så også raskt på begrensningene for hver støttet tilnærming.

Som vanlig er den fullstendige kildekoden som følger med opplæringen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found