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.