XML-szerializálás és deserializáció Jackson-szal

1. Áttekintés

Ebben az oktatóanyagban meg fogjuk vizsgálni hogyan lehet a Java objektumokat a Jackson 2.x használatával XML adatokká sorosítani és deszerializálni POJO-val.

Arra az alapműveletre összpontosítunk, amely nem igényel sok bonyolultságot vagy testreszabást.

2. XmlMapper Tárgy

XmlMapper a Jackson 2.x fő osztálya, amely segít a szerializálásban, ezért létre kell hoznunk egy példányát:

XmlMapper mapper = új XmlMapper ();

Ez térképező itt érhető el jackson-dataformat-xml jar, ezért hozzá kell adnunk, mint a mi függőségünket pom.xml:

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

Kérjük, ellenőrizze a jackson-dataformat-xml függőség legújabb verzióját a Maven tárházban.

3. Sorosítsa a Java-t XML-be

XmlMapper alosztálya ObjectMapper amelyet a JSON szerializálásakor használnak. Azonban hozzáad néhány XML-specifikus módosítást a szülőosztályhoz.

Most megvizsgálhatjuk, hogyan lehet használni a tényleges sorosítást. Először hozzunk létre egy Java osztályt:

osztály SimpleBean {private int x = 1; privát int y = 2; // szabványos beállítók és szerelők}

3.1. Serializálás az XML-re Húr

Sorosíthatjuk Java objektumunkat az XML-be Húr:

@Test public void, amikorJavaSerializedToXmlStr_thenCorrect () dobja a JsonProcessingException {XmlMapper xmlMapper = new XmlMapper (); Karakterlánc xml = xmlMapper.writeValueAsString (új SimpleBean ()); assertNotNull (xml); }

Ennek eredményeként a következőket kapjuk:

 1 2 

3.2. Serializálás az XML fájlba

Sorosíthatjuk Java objektumunkat az XML fájlba is:

@Test public void, amikorJavaSerializedToXmlFile_thenCorrect () dobja az IOException {XmlMapper xmlMapper = new XmlMapper (); xmlMapper.writeValue (új fájl ("simple_bean.xml"), új SimpleBean ()); File file = új File ("simple_bean.xml"); assertNotNull (fájl); }

Az alábbiakban láthatjuk az elnevezett fájl tartalmát simple_bean.xml:

 1 2 

4. Deserializálja az XML-t Java-ra

Ebben a szakaszban megvizsgáljuk, hogyan lehet Java objektumokat szerezni XML-ből.

4.1. Dezerializálás az XML karakterláncból

Csakúgy, mint a szerializálásnál, egy XML karakterláncot is deszerializálhatunk egy Java objektummá:

@Test public void, amikorJavaGotFromXmlStr_thenCorrect () dobja az IOException {XmlMapper xmlMapper = new XmlMapper (); SimpleBean érték = xmlMapper.readValue ("12", SimpleBean.class); assertTrue (érték.getX () == 1 && érték.getY () == 2); }

4.2. Dezerializálás az XML fájlból

Hasonlóképpen, ha van XML fájlunk, visszaállíthatjuk Java objektummá.

Itt először beolvassuk a fájlt bemeneti adatfolyamgá, majd a bemeneti adatfolyamot konvertáljuk a-ra Húr egyszerű segédprogram módszerrel.

A kód többi része hasonló a 4.1 szakaszban leírtakhoz:

@Test public void, amikorJavaGotFromXmlFile_thenCorrect () dobja az IOException {File file = new File ("simple_bean.xml"); XmlMapper xmlMapper = új XmlMapper (); String xml = inputStreamToString (új FileInputStream (fájl)); SimpleBean érték = xmlMapper.readValue (xml, SimpleBean.class); assertTrue (érték.getX () == 1 && érték.getY () == 2); }

A hasznossági módszer:

public String inputStreamToString (InputStream is) dobja az IOException-t {StringBuilder sb = new StringBuilder (); Vonósor; BufferedReader br = new BufferedReader (új InputStreamReader (is)); while ((line = br.readLine ())! = null) {sb.append (sor); } br.close (); return sb.toString (); }

5. Nagybetűs elemek kezelése

Ebben a szakaszban megvizsgáljuk, hogyan kezelhetjük azokat a forgatókönyveket, ahol vagy nagybetűs elemekkel rendelkező XML-t használunk a dezerializáláshoz, vagy pedig a Java-objektumokat egy vagy több nagybetűs írásmóddal kell XML-be sorosítanunk.

5.1. Dezerializálás az XML-ből Húr

Tegyük fel, hogy van egy XML -ünk, nagybetűs mezővel

 1 2 

A nagybetűs elemek helyes kezeléséhez meg kell jelölnünk az „x” mezőt a @JsonProperty kommentár:

class SimpleBeanForCapitalizedFields {@JsonProperty ("X") private int x = 1; privát int y = 2; // szokásos getters, setters}

Most helyesen deserializálhatunk egy XML-t Húr vissza egy Java objektumra:

@Test public void, amikorJavaGotFromXmlStrWithCapitalElem_thenCorrect () dobja az IOException {XmlMapper xmlMapper = new XmlMapper (); SimpleBeanForCapitalizedFields value = xmlMapper.readValue ("12", SimpleBeanForCapitalizedFields.class); assertTrue (érték.getX () == 1 && érték.getY () == 2); }

5.2. Serializálás az XML karakterláncra

A kötelező mezők jelölésével a @JsonProperty, helyesen sorosíthatjuk a Java objektumokat XML formátumba Húr egy vagy több nagybetűvel írt elemmel:

@Test public void, amikorJavaSerializedToXmlFileWithCapitalizedField_thenCorrect () dobja az IOException {XmlMapper xmlMapper = új XmlMapper (); xmlMapper.writeValue (új fájl ("target / simple_bean_capitalized.xml"), új SimpleBeanForCapitalizedFields ()); Fájlfájl = új Fájl ("target / simple_bean_capitalized.xml"); assertNotNull (fájl); }

6. Sorosít Lista XML-re

A XmlMapper képes egy teljes Java-babot sorossá tenni dokumentummá. A Java objektum XML formátumba konvertálásához egy egyszerű példát veszünk a beágyazott objektummal és tömbökkel.

Célunk, hogy sorosítsuk a Személy tárgy, annak összetételével együtt Cím objektum XML-be.

Végső XML-jünk a következőképpen fog kinézni:

 Rohan Daye 9911034731 9911033478 Név1 Város1 Név2 Város2 

Figyelje meg, hogy telefonszámaink a telefonszámok burkoló, míg a címünk nem.

Ezt az árnyalatot a @JacksonXMLElementWrapper annotáció a mi Személy osztály:

public final class Személy {private String keresztnév; privát karakterlánc vezetéknév; private List phoneNumbers = new ArrayList (); @JacksonXmlElementWrapper (useWrapping = hamis) privát lista címe = új ArrayList (); // szabványos beállítók és szerelők}

Valójában a csomagoló elem nevét megváltoztathatjuk @JacksonXmlElementWrapper (localName = ‘telefonszámok’). Vagy ha nem akarjuk elemeinket bepakolni, letilthatjuk a leképezést a @JacksonXmlElementWrapper (useWrapping = hamis).

És akkor határozzuk meg a sajátunkat Cím típus:

nyilvános osztály Cím {String streetName; Vonós város; // szabványos beállítók és szerelők}

Jackson gondoskodik a többiről helyettünk. A korábbiakhoz hasonlóan egyszerűen hívhatunk writeValue újra:

privát statikus végső karakterlánc XML = "..."; @Test public void, amikorJavaSerializedToXmlFile_thenSuccess () dobja az IOException {XmlMapper xmlMapper = new XmlMapper (); Személy személy = testPerson (); // tesztadatok ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream (); xmlMapper.writeValue (byteArrayOutputStream, személy); assertEquals (XML, byteArrayOutputStream.toString ()); }

7. Deserialize XML to Lista

Jackson képes olvasni az objektumok listáját tartalmazó XML-t is.

Ha ugyanazt az XML-t vesszük, mint korábban, akkor a readValue A módszer nem igazán jó:

@Test public void, amikorJavaDeserializedFromXmlFile_thenCorrect () dobja az IOException {XmlMapper xmlMapper = new XmlMapper (); Személyérték = xmlMapper.readValue (XML, Személy.osztály); assertEquals ("City1", value.getAddress (). get (0) .getCity ()); assertEquals ("City2", value.getAddress (). get (1) .getCity ()); }

8. Következtetés

Ez az egyszerű cikk bemutatta, hogyan lehet egyszerű POJO-t sorosítani XML-be, és hogyan lehet POJO-t szerezni az alapvető XML-adatokból.

Megvizsgáltuk azt is, hogyan lehet a gyűjteményeket tartalmazó összetett babokat sorosítani és deserializálni.

A cikkhez tartozó forráskód elérhető a GitHub oldalon.