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.