XML serializacija i deserijalizacija s Jacksonom

1. Pregled

U ovom uputstvu ćemo pogledati kako serializirati Java objekte na XML podatke pomoću Jacksona 2.x i deserializirati ih natrag u POJO.

Usredotočit ćemo se na osnovnu operaciju koja ne zahtijeva puno složenosti ili prilagodbe.

2. XmlMapper Objekt

XmlMapper je glavna klasa iz Jacksona 2.x koja nam pomaže u serializaciji, pa ćemo morati stvoriti instancu toga:

XmlMapper mapper = novi XmlMapper ();

Ovaj mapper je dostupan u jackson-dataformat-xml jar, pa ga moramo dodati kao ovisnost o našem pom.xml:

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

Molimo provjerite najnoviju verziju ovisnosti jackson-dataformat-xml u spremištu Maven.

3. Serijalizirajte Javu u XML

XmlMapper je podrazred od ObjectMapper koja se koristi u JSON serializaciji. Međutim, dodaje neke XML specifične prilagodbe nadređenoj klasi.

Sada možemo pogledati kako ga koristiti za stvarnu serializaciju. Stvorimo prvo Java klasu:

klasa SimpleBean {private int x = 1; privatni int y = 2; // standardni postavljači i dobivači}

3.1. Serijalizirajte u XML Niz

Svoj Java objekt možemo serializirati u XML Niz:

@Test public void whenJavaSerializedToXmlStr_thenCorrect () baca JsonProcessingException {XmlMapper xmlMapper = new XmlMapper (); Niz xml = xmlMapper.writeValueAsString (novi SimpleBean ()); assertNotNull (xml); }

Kao rezultat dobit ćemo:

 1 2 

3.2. Serijalizirajte u XML datoteku

Svoj Java objekt također možemo serializirati u XML datoteku:

@Test public void whenJavaSerializedToXmlFile_thenCorrect () baca IOException {XmlMapper xmlMapper = new XmlMapper (); xmlMapper.writeValue (nova datoteka ("simple_bean.xml"), nova SimpleBean ()); Datoteka datoteke = nova datoteka ("simple_bean.xml"); assertNotNull (datoteka); }

I ispod možemo vidjeti sadržaj rezultirajuće datoteke s imenom simple_bean.xml:

 1 2 

4. Deserijalizirajte XML na Javi

U ovom ćemo odjeljku pogledati kako dobiti Java objekte iz XML-a.

4.1. Deserijalizirajte iz XML niza

Kao i kod serializacije, također možemo deserializirati XML niz natrag na Java objekt:

@Test public void whenJavaGotFromXmlStr_thenCorrect () baca IOException {XmlMapper xmlMapper = new XmlMapper (); Vrijednost SimpleBean = xmlMapper.readValue ("12", SimpleBean.class); assertTrue (value.getX () == 1 && value.getY () == 2); }

4.2. Deserializirajte iz XML datoteke

Isto tako, ako imamo XML datoteku, možemo je pretvoriti natrag u Java objekt.

Ovdje datoteku prvo čitamo u ulazni tok, a zatim ulazni tok pretvaramo u Niz jednostavnom korisnom metodom.

Ostatak koda sličan je onom iz odjeljka 4.1:

@Test public void whenJavaGotFromXmlFile_thenCorrect () baca IOException {File file = new File ("simple_bean.xml"); XmlMapper xmlMapper = novi XmlMapper (); Niz xml = inputStreamToString (novi FileInputStream (datoteka)); Vrijednost SimpleBean = xmlMapper.readValue (xml, SimpleBean.class); assertTrue (value.getX () == 1 && value.getY () == 2); }

Korisna metoda:

javni String inputStreamToString (InputStream je) baca IOException {StringBuilder sb = new StringBuilder (); Linija niza; BufferedReader br = novi BufferedReader (novi InputStreamReader (je)); while ((linija = br.readLine ())! = null) {sb.append (linija); } br.close (); vratiti sb.toString (); }

5. Rukovanje velikim slovima

U ovom ćemo odjeljku pogledati kako postupati sa scenarijima u kojima imamo XML s velikim početnim elementima za deserializaciju ili moramo serializirati Java objekte u XML s jednim ili više velikih slova.

5.1. Deserijalizirajte iz XML-a Niz

Recimo da imamo XML s jednim poljem velikim slovom:

 1 2 

Da bismo pravilno rukovali velikim slovima, moramo polje "x" označiti s @JsonProperty napomena:

klasa SimpleBeanForCapitalizedFields {@JsonProperty ("X") private int x = 1; privatni int y = 2; // standardni getteri, postavljači}

Sada možemo ispravno deserializirati XML Niz natrag na Java objekt:

@Test public void whenJavaGotFromXmlStrWithCapitalElem_thenCorrect () baca IOException {XmlMapper xmlMapper = new XmlMapper (); SimpleBeanForCapitalizedFields vrijednost = xmlMapper.readValue ("12", SimpleBeanForCapitalizedFields.class); assertTrue (value.getX () == 1 && value.getY () == 2); }

5.2. Serijalizirajte u XML niz

Označavanjem obaveznih polja s @JsonProperty, možemo ispravno serializirati Java objekt u XML Niz s jednim ili više velikih slova:

@Test public void whenJavaSerializedToXmlFileWithCapitalizedField_thenCorrect () baca IOException {XmlMapper xmlMapper = new XmlMapper (); xmlMapper.writeValue (nova datoteka ("target / simple_bean_capitalized.xml"), nova SimpleBeanForCapitalizedFields ()); Datoteka datoteke = nova datoteka ("target / simple_bean_capitalized.xml"); assertNotNull (datoteka); }

6. Serijalizirati Popis u XML

The XmlMapper je u stanju serializirati cijeli Java zrno u dokument. Da bismo Java objekt pretvorili u XML, uzet ćemo jednostavan primjer s ugniježđenim objektom i nizovima.

Namjera nam je serializirati a Osoba objekt, zajedno s njegovim sastavljenim Adresa objekt u XML.

Naš konačni XML izgledat će otprilike ovako:

 Rohan Daye 9911034731 9911033478 Ime1 Grad1 Ime2 Grad2 

Primijetite da su naši brojevi telefona ugrađeni u brojevi telefona omot dok naša adresa nije.

Ovu nijansu možemo izraziti putem @JacksonXMLElementWrapper bilješka u našem Osoba razred:

javni završni razred Osoba {private String firstName; private String lastName; privatni popis phoneNumbers = novi ArrayList (); @JacksonXmlElementWrapper (useWrapping = false) adresa privatnog popisa = new ArrayList (); // standardni postavljači i dobivači}

Zapravo, naziv elementa za omatanje možemo promijeniti s @JacksonXmlElementWrapper (localName = 'telefonski brojevi'). Ili, ako ne želimo omotati naše elemente, možemo onemogućiti mapiranje pomoću @JacksonXmlElementWrapper (useWrapping = false).

A onda definirajmo svoje Adresa tip:

javna klasa Adresa {String streetName; Gudački grad; // standardni postavljači i dobivači}

Jackson se za ostalo brine za nas. Kao i prije, jednostavno možemo nazvati writeValue opet:

privatni statički završni niz XML = "..."; @Test public void whenJavaSerializedToXmlFile_thenSuccess () baca IOException {XmlMapper xmlMapper = new XmlMapper (); Osoba osoba = testPerson (); // test podaci ByteArrayOutputStream byteArrayOutputStream = novi ByteArrayOutputStream (); xmlMapper.writeValue (byteArrayOutputStream, osoba); assertEquals (XML, byteArrayOutputStream.toString ()); }

7. Deserijalizirajte XML na Popis

Jackson također može čitati XML koji sadrži popise objekata.

Ako uzmemo isti XML kao i prije, readValue metoda se izvrsno ponaša:

@Test public void whenJavaDeserializedFromXmlFile_thenCorrect () baca IOException {XmlMapper xmlMapper = new XmlMapper (); Vrijednost osobe = xmlMapper.readValue (XML, Person.class); assertEquals ("City1", value.getAddress (). get (0) .getCity ()); assertEquals ("City2", value.getAddress (). get (1) .getCity ()); }

8. Zaključak

Ovaj jednostavan članak ilustrirao je kako serializirati jednostavan POJO u XML i dobiti POJO iz osnovnih XML podataka.

Također smo istražili kako serializirati i deserializirati složeni grah koji sadrži zbirke.

Izvorni kod koji prati ovaj članak dostupan je na GitHubu.