Converteer XML naar JSON met Jackson

1. Overzicht

In deze zelfstudie zullen we zien hoe u een XML-bericht naar JSON converteert met Jackson.

Voor lezers die nieuw zijn bij Jackson, overweeg om eerst vertrouwd te raken met de basisprincipes.

2. Een inleiding tot Jackson

We kunnen JSON op drie verschillende manieren ontleden met Jackson:

  • De eerste en meest voorkomende is gegevensbinding met ObjectMapper
  • De tweede is mapping naar een boom datastructuur met TreeTraversingParser en JsonNode
  • En de derde is het streamen van de boomgegevensstructuur per token, met behulp van JsonParser en JsonGenerator

Nu ondersteunt Jackson ook de eerste twee voor XML-gegevens. Laten we daarom eens kijken hoe Jackson ons kan helpen bij de conversie van het ene formaat naar het andere.

3. Afhankelijkheden

Eerst moeten we de jackson-databind afhankelijkheid van onze pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Met deze bibliotheek kunnen we de gegevensbinding-API gebruiken.

De tweede is jackson-dataformat-xml die de XML-ondersteuning van Jackson toevoegt:

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

4. Gegevensbinding

Gegevensbinding is, simpel gezegd, wanneer we geserialiseerde gegevens rechtstreeks aan een Java-object willen toewijzen.

Om dit te verkennen, laten we onze XML definiëren met Bloem en Kleur eigendommen:

 Poppy ROOD 9 

Dit is vergelijkbaar met deze Java-notatie:

openbare klasse Flower {private String naam; privé kleur kleur; private Integer bloemblaadjes; // getters and setters} public enum Kleur {ROZE, BLAUW, GEEL, ROOD; }

Onze eerste stap zal zijn om de XML in een Bloem voorbeeld. Om dat te doen, maken we een instantie van XmlMapper, Jackson's XML-equivalent voor ObjectMapper en gebruik zijn readValue methode:

XmlMapper xmlMapper = nieuwe XmlMapper (); Bloempapaver = xmlMapper.readValue (xml, Flower.class);

Zodra we onze hebben Bloem we willen het bijvoorbeeld wegschrijven als JSON met behulp van het bekende ObjectMapper:

ObjectMapper-mapper = nieuwe ObjectMapper (); String json = mapper.writeValueAsString (klaproos);

En als resultaat krijgen we ons JSON-equivalent:

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

5. Traversal van bomen

Soms kan direct kijken naar de boomstructuur meer flexibiliteit bieden, bijvoorbeeld in het geval dat we geen tussenklasse willen behouden of we slechts een deel van de structuur willen converteren.

Hoewel, zoals we zullen zien, het gepaard gaat met enkele afwegingen.

De eerste stap is vergelijkbaar met onze eerste stap wanneer we gegevensbinding gebruiken. Deze keer gebruiken we echter de leesboom methode:

XmlMapper xmlMapper = nieuwe XmlMapper (); JsonNode-knooppunt = xmlMapper.readTree (xml.getBytes ());

Als we dit hebben gedaan, hebben we een JsonNode die 3 kinderen heeft, zoals we hadden verwacht: naam, kleur, en bloemblaadjes.

Daarna kunnen we opnieuw gebruiken ObjectMapper, gewoon onze JsonNode in plaats daarvan:

ObjectMapper jsonMapper = nieuwe ObjectMapper (); String json = jsonMapper.writeValueAsString (knooppunt);

Nu is het resultaat iets anders dan in ons laatste voorbeeld:

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

Na zorgvuldige inspectie kunnen we zien dat het kenmerk bloemblaadjes is geserialiseerd in een string in plaats van een nummer!Dit is zo omdat leesboom leidt het datatype niet af zonder een expliciete definitie.

5.1. Beperkingen

En er zijn bepaalde beperkingen met de ondersteuning van Jackson's XML-tree traversal:

  • Jackson kan geen onderscheid maken tussen een object en een array. Omdat XML native structuren mist om een ​​object te onderscheiden van een lijst met objecten, zal Jackson eenvoudig herhaalde elementen samenvoegen tot een enkele waarde.
  • En aangezien Jackson elk XML-element aan een JSON-knooppunt wil toewijzen, ondersteunt het geen gemengde inhoud.

Om deze redenen raden de officiële Jackson-documenten het gebruik van Tree-modellen aan om XML te parseren.

6. Geheugenbeperkingen

Nu hebben beide het opmerkelijke nadeel dat de volledige XML tegelijkertijd in het geheugen moet zijn om de conversie uit te voeren. Totdat Jackson het streamen van de boomstructuur als tokens ondersteunt, zullen we aan deze beperking blijven hangen of moeten we kijken hoe we onze eigen boomstructuur kunnen rollen met zoiets als XMLStreamReader.

7. Conclusie

In deze tutorial hebben we kort verschillende manieren geleerd waarop Jackson XML-gegevens kan lezen en naar JSON kan schrijven. We hebben ook kort gekeken naar de beperkingen van elke ondersteunde aanpak.

Zoals gewoonlijk is de volledige broncode die bij de tutorial hoort, beschikbaar op GitHub.