XML-serialisering og deserialisering med Jackson

1. Oversigt

I denne vejledning skal vi se på hvordan man serialiserer Java-objekter til XML-data ved hjælp af Jackson 2.x og deserialiserer det tilbage til en POJO.

Vi vil fokusere på den grundlæggende operation, der ikke kræver meget kompleksitet eller tilpasning.

2. XmlMapper Objekt

XmlMapper er hovedklassen fra Jackson 2.x, der hjælper os med serialisering, så vi bliver nødt til at oprette en forekomst af den:

XmlMapper-kortlægger = ny XmlMapper ();

Det her kortlægger er tilgængelig i jackson-dataformat-xml krukke, så vi er nødt til at tilføje det som en afhængighed af vores pom.xml:

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

Kontroller den seneste version af afhængigheden jackson-dataformat-xml i Maven-arkivet.

3. Serialiser Java til XML

XmlMapper er en underklasse af ObjectMapper som bruges i JSON-serialisering. Det tilføjer dog nogle XML-specifikke justeringer til overordnede klassen.

Vi kan nu se på, hvordan vi bruger det til at udføre den aktuelle serialisering. Lad os først oprette en Java-klasse:

klasse SimpleBean {privat int x = 1; privat int y = 2; // standard settere og getters}

3.1. Serialiser til XML Snor

Vi kan serieisere vores Java-objekt i XML Snor:

@Test offentlig ugyldig nårJavaSerializedToXmlStr_thenCorrect () kaster JsonProcessingException {XmlMapper xmlMapper = ny XmlMapper (); String xml = xmlMapper.writeValueAsString (ny SimpleBean ()); assertNotNull (xml); }

Som et resultat får vi:

 1 2 

3.2. Serialiser til XML-filen

Vi kan også serieisere vores Java-objekt til XML-filen:

@Test offentlig ugyldig nårJavaSerializedToXmlFile_thenCorrect () kaster IOException {XmlMapper xmlMapper = ny XmlMapper (); xmlMapper.writeValue (ny fil ("simple_bean.xml"), ny SimpleBean ()); Filfil = ny fil ("simple_bean.xml"); assertNotNull (fil); }

Og nedenfor kan vi se indholdet af den resulterende fil, der hedder simple_bean.xml:

 1 2 

4. Deserialiser XML til Java

I dette afsnit ser vi på, hvordan man får Java-objekter fra XML.

4.1. Deserialiser fra XML-strengen

Som med serialisering kan vi også deserialisere en XML-streng tilbage til et Java-objekt:

@Test offentlig ugyldigt nårJavaGotFromXmlStr_thenCorrect () kaster IOException {XmlMapper xmlMapper = ny XmlMapper (); SimpleBean-værdi = xmlMapper.readValue ("12", SimpleBean.class); assertTrue (value.getX () == 1 && value.getY () == 2); }

4.2. Deserialiser fra XML-filen

Ligeledes, hvis vi har en XML-fil, kan vi konvertere den tilbage til et Java-objekt.

Her læser vi først filen i en inputstrøm og konverterer derefter inputstrømmen til en Snor med en simpel hjælpemetode.

Resten af ​​koden svarer til den fra afsnit 4.1:

@Test offentligt ugyldigt nårJavaGotFromXmlFile_thenCorrect () kaster IOException {File file = new File ("simple_bean.xml"); XmlMapper xmlMapper = ny XmlMapper (); String xml = inputStreamToString (ny FileInputStream (fil)); SimpleBean-værdi = xmlMapper.readValue (xml, SimpleBean.class); assertTrue (value.getX () == 1 && value.getY () == 2); }

Hjælpemetoden:

offentlig String inputStreamToString (InputStream er) kaster IOException {StringBuilder sb = ny StringBuilder (); Streng linje; BufferedReader br = ny BufferedReader (ny InputStreamReader (er)); mens ((line = br.readLine ())! = null) {sb.append (line); } br.close (); returner sb.toString (); }

5. Håndtering af aktiverede elementer

I dette afsnit ser vi på, hvordan man håndterer scenarier, hvor vi enten har XML med store bogstaver for at deserialisere, eller vi har brug for at serialisere Java-objekter til XML med et eller flere store bogstaver.

5.1. Deserialiser fra XML Snor

Lad os sige, at vi har en XML med et stort felt:

 1 2 

For at kunne håndtere store og små bogstaver korrekt skal vi kommentere feltet "x" med @JsonProperty kommentar:

klasse SimpleBeanForCapitalizedFields {@JsonProperty ("X") privat int x = 1; privat int y = 2; // standard getters, setters}

Vi kan nu deserialisere en XML korrekt Snor tilbage til et Java-objekt:

@Test offentlig ugyldig nårJavaGotFromXmlStrWithCapitalElem_thenCorrect () kaster IOException {XmlMapper xmlMapper = ny XmlMapper (); SimpleBeanForCapitalizedFields værdi = xmlMapper.readValue ("12", SimpleBeanForCapitalizedFields.class); assertTrue (value.getX () == 1 && value.getY () == 2); }

5.2. Serialiser til XML-strengen

Ved at kommentere obligatoriske felter med @JsonProperty, vi kan korrekt serieisere et Java-objekt til en XML Snor med et eller flere store bogstaver:

@Test offentlig ugyldig nårJavaSerializedToXmlFileWithCapitalizedField_thenCorrect () kaster IOException {XmlMapper xmlMapper = ny XmlMapper (); xmlMapper.writeValue (ny fil ("target / simple_bean_capitalized.xml"), ny SimpleBeanForCapitalizedFields ()); Filfil = ny fil ("target / simple_bean_capitalized.xml"); assertNotNull (fil); }

6. Serialiser Liste til XML

Det XmlMapper er i stand til at serieisere en hel Java-bønne til et dokument. For at konvertere Java-objekt til XML tager vi et simpelt eksempel med det indlejrede objekt og arrays.

Vores hensigt er at serieisere en Person objekt sammen med dets sammensatte Adresse objekt i XML.

Vores endelige XML vil se ud som:

 Rohan Daye 9911034731 9911033478 Navn1 By1 Navn2 By2 

Bemærk, at vores telefonnumre er indkapslet i en telefonnumre indpakning, mens vores adresse ikke er.

Vi kan udtrykke denne nuance via @JacksonXMLElementWrapper kommentar i vores Person klasse:

offentlig endelig klasse Person {privat streng fornavn; privat streng efternavn; privat liste telefonnumre = ny ArrayList (); @JacksonXmlElementWrapper (useWrapping = false) privat liste adresse = ny ArrayList (); // standard settere og getters}

Faktisk kan vi ændre indpakningselementets navn med @JacksonXmlElementWrapper (localName = ‘telefonnumre’). Eller hvis vi ikke ønsker at pakke vores elementer ind, kan vi deaktivere kortlægningen med @JacksonXmlElementWrapper (useWrapping = false).

Og så lad os definere vores Adresse type:

offentlig klasse Adresse {String streetName; String by; // standard settere og getters}

Jackson tager sig af resten for os. Som før kan vi bare ringe skrivVærdi igen:

privat statisk endelig String XML = "..."; @Test offentlig ugyldig nårJavaSerializedToXmlFile_thenSuccess () kaster IOException {XmlMapper xmlMapper = ny XmlMapper (); Person person = testPerson (); // testdata ByteArrayOutputStream byteArrayOutputStream = ny ByteArrayOutputStream (); xmlMapper.writeValue (byteArrayOutputStream, person); assertEquals (XML, byteArrayOutputStream.toString ()); }

7. Deserialiser XML til Liste

Jackson kan også læse XML, der også indeholder lister over objekter.

Hvis vi tager vores samme XML som før, bliver readValue metoden går fint:

@Test offentligt ugyldigt nårJavaDeserializedFromXmlFile_thenCorrect () kaster IOException {XmlMapper xmlMapper = ny XmlMapper (); Personværdi = xmlMapper.readValue (XML, Person.class); assertEquals ("City1", value.getAddress (). get (0) .getCity ()); assertEquals ("City2", value.getAddress (). get (1) .getCity ()); }

8. Konklusion

Denne enkle artikel illustrerede, hvordan man serierer en simpel POJO til XML og får en POJO fra basale XML-data.

Vi har også undersøgt, hvordan vi kan serieisere og deserialisere komplekse bønner, der indeholder samlinger.

Kildekoden, der ledsager denne artikel, er tilgængelig på GitHub.