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.