XStream felhasználói útmutató: XML átalakítása objektumokká

1. Áttekintés

Egy korábbi cikkünkben megtanultuk, hogyan használhatjuk az XStream-et a Java objektumok XML formátumba történő sorosítására. Ebben az oktatóanyagban megtanuljuk a fordított módszert: az XML deserializálását Java objektumokká. Ezeket a feladatokat kommentárokkal vagy programozottan is el lehet végezni.

Az XStream beállításának alapvető követelményeivel és annak függőségeivel kapcsolatban olvassa el az előző cikket.

2. Deserializáljon egy objektumot XML-ből

Először tegyük fel, hogy a következő XML-t használjuk:

 John Doe 1986-02-14 03: 46: 16.381 UTC 

Ezt át kell alakítanunk Java-ra Vevő tárgy:

public class Ügyfél {private String keresztnév; privát karakterlánc vezetéknév; magán dátum dob; // szabványos beállítók és szerelők} 

Az XML számos módon bevihető, beleértve a File, InputStream, Olvasó, vagy Húr. Az egyszerűség kedvéért feltételezzük, hogy a fenti XML van a Húr tárgy.

Ügyfél convertCustomer = (Ügyfél) xstream.fromXML (customerXmlString); Assert.assertTrue (convertCustomer.getFirstName (). Egyenlő ("John"));

3. Álnevek

Az első példában az XML az osztály teljes minősítéssel rendelkezett a legkülső XML címkében, amely megegyezett a Vevő osztály. Ezzel a beállítással az XStream minden további konfiguráció nélkül könnyen konvertálja az XML-t objektummá. De lehet, hogy nem mindig vannak ilyen feltételeink. Lehet, hogy nincs kontrollunk az XML-címkék elnevezése felett, vagy úgy döntünk, hogy álneveket adunk a mezőkhöz.

Tegyük fel például, hogy módosítottuk az XML-t, hogy a külső címkéhez ne használjuk a teljesen minősített osztálynevet:

 John Doe 1986-02-14 03: 46: 16.381 UTC 

Titkosíthatjuk ezt az XML-t álnevek létrehozásával.

3.1. Osztály álnevek

Az álneveket programozottan vagy kommentárok segítségével regisztráljuk az XStream példányban. Feljegyezhetjük a mi Vevő osztályban @XStreamAlias:

@XStreamAlias ​​("customer") public class Customer {// ...}

Most be kell állítanunk az XStream példányt a következő kommentár használatához:

xstream.processAnnotations (Ügyfél.osztály);

Alternatív megoldásként, ha egy álnevet programozottan akarunk konfigurálni, használhatjuk az alábbi kódot:

xstream.alias ("ügyfél", Ügyfél.osztály);

3.2. Field Aliases

Tegyük fel, hogy a következő XML van:

 John Doe 1986-02-14 03: 46: 16.381 UTC 

A fn címke nem egyezik a mezőnkkel Vevő objektumot, ezért meg kell határoznunk egy álnevet ahhoz a mezőhöz, ha deszerializálni akarjuk. Ezt a következő megjegyzéssel érhetjük el:

@XStreamAlias ​​("fn") privát karakterlánc keresztnév;

Alternatív megoldásként ugyanazt a célt programszerűen is megvalósíthatjuk:

xstream.aliasField ("fn", Customer.class, "keresztnév");

4. Implicit gyűjtemények

Tegyük fel, hogy a következő XML áll rendelkezésünkre, amely egyszerű listát tartalmaz Elérhetőségeit:

 John Doe 1986-02-14 04: 14: 20.541 UTC 6673543265 0124-2460311 ... 

Betöltjük a listát Elérhetőségeit ba be Lista mező a Java objektumunkban. Ezt a következő megjegyzéssel érhetjük el:

@XStreamImplicit privát lista contactDetailsList;

Alternatív megoldásként ugyanazt a célt programszerűen is megvalósíthatjuk:

xstream.addImplicitCollection (Customer.class, "contactDetailsList");

5.Mezők figyelmen kívül hagyása

Tegyük fel, hogy a következő XML-t használjuk:

 John Doe 1986-02-14 04: 14: 20.541 UTC John Doe 

A fenti XML-ben van egy extra elemünk ami hiányzik a Java-ból Vevő tárgy.

Ha megpróbáljuk deserializálni a fenti xml-t anélkül, hogy különösebb gondot fordítanánk egy extra elemre, a program dob egy UnknownFieldException.

Nincs ilyen mező: com.baeldung.pojo.Customer.fullName

Amint a kivétel egyértelműen kimondja, az XStream nem ismeri fel a mezőt teljes név.

A probléma leküzdéséhez be kell állítanunk, hogy figyelmen kívül hagyja az ismeretlen elemeket:

xstream.ignoreUnknownElements ();

6. Attribútum mezők

Tegyük fel, hogy olyan elemekkel rendelkezik XML attribútumokkal, amelyeket az objektum mezőként deszerializálni szeretnénk. Hozzáadunk egy kontakt típus attribútum a mi Elérhetőségeit tárgy:

 6673543265 0124-2460311 

Ha deserializálni akarjuk a kontakt típus XML attribútum, használhatjuk a @XStreamAsAttribute annotáció azon a mezőn, ahol szeretnénk, hogy megjelenjen:

@XStreamAsAttribute private String contactType;

Alternatív megoldásként ugyanazt a célt programszerűen is megvalósíthatjuk:

xstream.useAttributeFor (ContactDetails.class, "contactType");

7. Következtetés

Ebben a cikkben megvizsgáltuk azokat a lehetőségeket, amelyek rendelkezésre állnak, amikor az XML-t Java objektumokhoz deszerializáljuk az XStream használatával.

A cikk teljes forráskódja letölthető a linkelt GitHub-tárból.


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