Guida per l'utente XStream: conversione di XML in oggetti

1. Panoramica

In un articolo precedente, abbiamo appreso come utilizzare XStream per serializzare oggetti Java in XML. In questo tutorial, impareremo come fare il contrario: deserializzare XML in oggetti Java. Queste attività possono essere eseguite utilizzando annotazioni o in modo programmatico.

Per conoscere i requisiti di base per la configurazione di XStream e le sue dipendenze, fare riferimento all'articolo precedente.

2. Deserializzare un oggetto da XML

Per cominciare, supponiamo di avere il seguente XML:

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

Dobbiamo convertirlo in un oggetto Java Customer :

public class Customer { private String firstName; private String lastName; private Date dob; // standard setters and getters } 

L'XML può essere immesso in diversi modi, inclusi File , InputStream , Reader o String . Per semplicità, supponiamo di avere l'XML sopra in un oggetto String .

Customer convertedCustomer = (Customer) xstream.fromXML(customerXmlString); Assert.assertTrue(convertedCustomer.getFirstName().equals("John"));

3. Alias

Nel primo esempio, l'XML aveva il nome completo della classe nel tag XML più esterno, corrispondente alla posizione della nostra classe Customer . Con questa configurazione, XStream converte facilmente l'XML nel nostro oggetto senza alcuna configurazione aggiuntiva. Ma potremmo non avere sempre queste condizioni. Potremmo non avere il controllo sulla denominazione dei tag XML o potremmo decidere di aggiungere alias per i campi.

Ad esempio, supponiamo di aver modificato il nostro XML per non utilizzare il nome completo della classe per il tag esterno:

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

Possiamo nascondere questo XML creando alias.

3.1. Alias ​​di classe

Registriamo gli alias con l'istanza XStream a livello di codice o utilizzando le annotazioni. Possiamo annotare la nostra classe Customer con @XStreamAlias :

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

Ora dobbiamo configurare la nostra istanza XStream per utilizzare questa annotazione:

xstream.processAnnotations(Customer.class);

In alternativa, se desideriamo configurare un alias in modo programmatico, possiamo utilizzare il codice seguente:

xstream.alias("customer", Customer.class);

3.2. Alias ​​di campo

Supponiamo di avere il seguente XML:

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

Il tag fn non corrisponde ad alcun campo nel nostro oggetto Cliente , quindi dovremo definire un alias per quel campo se desideriamo deserializzarlo. Possiamo ottenere ciò utilizzando la seguente annotazione:

@XStreamAlias("fn") private String firstName;

In alternativa, possiamo raggiungere lo stesso obiettivo in modo programmatico:

xstream.aliasField("fn", Customer.class, "firstName");

4. Collezioni implicite

Supponiamo di avere il seguente XML, contenente un semplice elenco di ContactDetails :

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

Vogliamo caricare l'elenco di ContactDetails in un campo List nel nostro oggetto Java. Possiamo ottenere ciò utilizzando la seguente annotazione:

@XStreamImplicit private List contactDetailsList;

In alternativa, possiamo raggiungere lo stesso obiettivo in modo programmatico:

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

5. Ignora i campi

Supponiamo di avere il seguente XML:

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

Nell'XML sopra, abbiamo un elemento extra che manca dal nostro oggetto Java Customer .

Se proviamo a deserializzare l'xml di cui sopra senza preoccuparci dell'elemento aggiuntivo, il programma lancia un'eccezione UnknownFieldException .

No such field com.baeldung.pojo.Customer.fullName

Come afferma chiaramente l'eccezione, XStream non riconosce il campo fullName .

Per ovviare a questo problema dobbiamo configurarlo per ignorare gli elementi sconosciuti:

xstream.ignoreUnknownElements();

6. Campi degli attributi

Supponiamo di avere XML con attributi come parte di elementi che vorremmo deserializzare come campo nel nostro oggetto. Aggiungeremo un attributo contactType al nostro oggetto ContactDetails :

 6673543265 0124-2460311 

Se vogliamo deserializzare l' attributo XML contactType , possiamo utilizzare l' annotazione @XStreamAsAttribute nel campo in cui vorremmo che appaia:

@XStreamAsAttribute private String contactType;

In alternativa, possiamo raggiungere lo stesso obiettivo in modo programmatico:

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

7. Conclusione

In questo articolo, abbiamo esplorato le opzioni che abbiamo a disposizione durante la deserializzazione di XML in oggetti Java utilizzando XStream.

Il codice sorgente completo per questo articolo può essere scaricato dal repository GitHub collegato.