Serializácia a deserializácia XML s Jacksonom

1. Prehľad

V tomto návode sa pozrieme na ako serializovať objekty Java na dáta XML pomocou Jackson 2.x a deserializovať ich späť na POJO.

Zameriame sa na základné fungovanie, ktoré nevyžaduje veľkú zložitosť ani prispôsobenie.

2. XmlMapper Objekt

XmlMapper je hlavná trieda z Jackson 2.x, ktorá nám pomáha pri serializácii, takže budeme musieť vytvoriť jej inštanciu:

Mapovač XmlMapper = nový XmlMapper ();

Toto mapovač je k dispozícii v jackson-dataformat-xml jar, takže to musíme pridať ako závislosť k nášmu pom.xml:

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

Skontrolujte najnovšiu verziu závislosti jackson-dataformat-xml v úložisku Maven.

3. Serializujte Java na XML

XmlMapper je podtrieda ObjectMapper ktorý sa používa pri serializácii JSON. Do rodičovskej triedy však pridáva niektoré vylepšenia špecifické pre XML.

Teraz sa môžeme pozrieť na to, ako ho použiť na vykonanie skutočnej serializácie. Najprv vytvoríme triedu Java:

trieda SimpleBean {private int x = 1; súkromné ​​int y = 2; // štandardní zakladatelia a obstarávatelia}

3.1. Serializujte do formátu XML String

Môžeme serializovať náš objekt Java do XML String:

@ Test public void whenJavaSerializedToXmlStr_thenCorrect () vyvolá JsonProcessingException {XmlMapper xmlMapper = nový XmlMapper (); Reťazec xml = xmlMapper.writeValueAsString (nový SimpleBean ()); assertNotNull (xml); }

Vo výsledku dostaneme:

 1 2 

3.2. Serializujte do súboru XML

Môžeme tiež serializovať náš objekt Java do súboru XML:

@ Test public void whenJavaSerializedToXmlFile_thenCorrect () hodí IOException {XmlMapper xmlMapper = nový XmlMapper (); xmlMapper.writeValue (nový súbor ("simple_bean.xml"), nový SimpleBean ()); File file = new File ("simple_bean.xml"); assertNotNull (súbor); }

A nižšie vidíme obsah výsledného súboru s názvom simple_bean.xml:

 1 2 

4. Deserializujte XML na Javu

V tejto časti sa pozrieme na to, ako získať objekty Java z XML.

4.1. Deserializácia z reťazca XML

Rovnako ako pri serializácii, môžeme aj my rekonštruovať reťazec XML späť na objekt Java:

@Test public void whenJavaGotFromXmlStr_thenCorrect () hodí IOException {XmlMapper xmlMapper = nový XmlMapper (); Hodnota SimpleBean = xmlMapper.readValue ("12", SimpleBean.class); assertTrue (value.getX () == 1 && value.getY () == 2); }

4.2. Deserializácia zo súboru XML

Rovnako, ak máme súbor XML, môžeme ho previesť späť na objekt Java.

Tu najskôr načítame súbor do vstupného toku a potom prevedieme vstupný prúd na a String jednoduchou úžitkovou metódou.

Zvyšok kódu je podobný ako v časti 4.1:

@Test public void whenJavaGotFromXmlFile_thenCorrect () vyvolá IOException {File file = new File ("simple_bean.xml"); XmlMapper xmlMapper = nový XmlMapper (); Reťazec xml = inputStreamToString (nový FileInputStream (súbor)); Hodnota SimpleBean = xmlMapper.readValue (xml, SimpleBean.class); assertTrue (value.getX () == 1 && value.getY () == 2); }

Úžitková metóda:

public String inputStreamToString (InputStream is) vyvolá IOException {StringBuilder sb = new StringBuilder (); Šnúrka; BufferedReader br = nový BufferedReader (nový InputStreamReader (je)); while ((line = br.readLine ())! = null) {sb.append (line); } br.close (); vrátiť sb.toString (); }

5. Zaobchádzanie s veľkými písmenami

V tejto časti sa pozrieme na to, ako zvládnuť scenáre, keď máme XML s veľkými prvkami na deserializáciu alebo potrebujeme serializovať Java objekty do XML s jedným alebo viacerými veľkými písmenami.

5.1. Deserializácia z XML String

Povedzme, že máme XML s jedným veľkým písmenom:

 1 2 

Aby sme správne manipulovali s prvkami písanými veľkými písmenami, musíme pole „x“ anotovať znakom @JsonProperty anotácia:

trieda SimpleBeanForCapitalizedFields {@JsonProperty ("X") súkromné ​​int x = 1; súkromné ​​int y = 2; // štandardné getre, setre}

Teraz môžeme správne deserializovať XML String späť na objekt Java:

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

5.2. Serializujte na reťazec XML

Pridaním anotácie povinných polí k @JsonProperty, môžeme správne serializovať objekt Java do formátu XML String s jedným alebo viacerými prvkami s veľkým začiatočným písmenom:

@ Test public void whenJavaSerializedToXmlFileWithCapitalizedField_thenCorrect () vyvolá IOException {XmlMapper xmlMapper = nový XmlMapper (); xmlMapper.writeValue (nový súbor ("target / simple_bean_capitalized.xml"), nový SimpleBeanForCapitalizedFields ()); File file = new File ("target / simple_bean_capitalized.xml"); assertNotNull (súbor); }

6. Serializovať Zoznam do XML

The XmlMapper je schopný serializovať celý bean Java do dokumentu. Ak chcete previesť objekt Java na XML, vezmeme si jednoduchý príklad s vnoreným objektom a poľami.

Naším zámerom je serializovať a Osoba objekt spolu s jeho zloženým Adresa objekt, do XML.

Naše konečné XML bude vyzerať asi takto:

 Rohan Daye 9911034731 9911033478 Meno1 Mesto1 Meno2 Mesto2 

Všimnite si, že naše telefónne čísla sú obsiahnuté v a telefónne čísla wrapper, zatiaľ čo naša adresa nie je.

Túto nuanciu môžeme vyjadriť pomocou @JacksonXMLElementWrapper anotácia v našom Osoba trieda:

verejná posledná trieda Osoba {private String firstName; private String priezvisko; private List phoneNumbers = new ArrayList (); @JacksonXmlElementWrapper (useWrapping = false) súkromná adresa zoznamu = nový ArrayList (); // štandardní zakladatelia a obstarávatelia}

V skutočnosti môžeme názov zalamovacieho prvku zmeniť pomocou @JacksonXmlElementWrapper (localName = ‘telefónne čísla’). Alebo ak nechceme zabaliť naše prvky, môžeme deaktivovať mapovanie pomocou @JacksonXmlElementWrapper (useWrapping = false).

A potom si zadefinujme naše Adresa typ:

verejná trieda Adresa {String streetName; Mesto reťazca; // štandardní zakladatelia a obstarávatelia}

O zvyšok sa stará Jackson. Rovnako ako predtým, môžeme jednoducho zavolať writeValue ešte raz:

private static final String XML = "..."; @Test public void whenJavaSerializedToXmlFile_thenSuccess () hodí IOException {XmlMapper xmlMapper = nový XmlMapper (); Osoba osoba = testPerson (); // testovacie dáta ByteArrayOutputStream byteArrayOutputStream = nový ByteArrayOutputStream (); xmlMapper.writeValue (byteArrayOutputStream, osoba); assertEquals (XML, byteArrayOutputStream.toString ()); }

7. Deserializácia XML na Zoznam

Jackson vie čítať aj XML obsahujúci zoznamy objektov.

Ak vezmeme naše rovnaké XML ako predtým, readValue metóda je v poriadku:

@ Test public void whenJavaDeserializedFromXmlFile_thenCorrect () vyvolá IOException {XmlMapper xmlMapper = nový XmlMapper (); Hodnota osoby = xmlMapper.readValue (XML, Person.class); assertEquals ("City1", value.getAddress (). get (0) .getCity ()); assertEquals ("City2", value.getAddress (). get (1) .getCity ()); }

8. Záver

Tento jednoduchý článok ilustroval, ako serializovať jednoduchý POJO na XML a získať POJO zo základných údajov XML.

Pozreli sme sa tiež na to, ako serializovať a deserializovať zložité fazule, ktoré obsahujú zbierky.

Zdrojový kód, ktorý je priložený k tomuto článku, je k dispozícii na GitHub.


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