XStream-gebruikershandleiding: XML naar objecten converteren

1. Overzicht

In een vorig artikel hebben we geleerd hoe we XStream kunnen gebruiken om Java-objecten naar XML te serialiseren. In deze tutorial leren we hoe we het omgekeerde kunnen doen: XML naar Java-objecten deserialiseren. Deze taken kunnen worden uitgevoerd met behulp van annotaties of programmatisch.

Raadpleeg het vorige artikel voor meer informatie over de basisvereisten voor het instellen van XStream en de bijbehorende afhankelijkheden.

2. Deserialiseer een object vanuit XML

Stel dat we om te beginnen de volgende XML hebben:

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

We moeten dit converteren naar een Java Klant voorwerp:

openbare klasse Klant {private String firstName; private String achternaam; privé Datum dob; // standaard setters en getters} 

De XML kan op een aantal manieren worden ingevoerd, waaronder het dossier, InputStream, Lezer, of Draad. Voor de eenvoud gaan we ervan uit dat we de bovenstaande XML in een Draad voorwerp.

Klant geconverteerdCustomer = (Klant) xstream.fromXML (customerXmlString); Assert.assertTrue (geconverteerdeCustomer.getFirstName (). Is gelijk aan ("John"));

3. Aliassen

In het eerste voorbeeld had de XML de volledig gekwalificeerde naam van de klasse in de buitenste XML-tag, die overeenkomt met de locatie van onze Klant klasse. Met deze setup converteert XStream eenvoudig de XML naar ons object zonder enige extra configuratie. Maar we hebben misschien niet altijd deze voorwaarden. Mogelijk hebben we geen controle over de naamgeving van de XML-tag, of besluiten we aliassen voor velden toe te voegen.

Stel dat we onze XML hebben aangepast om niet de volledig gekwalificeerde klassenaam voor de buitenste tag te gebruiken:

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

We kunnen deze XML verbergen door aliassen te maken.

3.1. Klasse-aliassen

We registreren aliassen met de XStream-instantie, hetzij programmatisch, hetzij met behulp van annotaties. We kunnen onze Klant les met @RTLnieuws:

@XStreamAlias ​​("klant") openbare klasse Klant {// ...}

Nu moeten we onze XStream-instantie configureren om deze annotatie te gebruiken:

xstream.processAnnotations (Customer.class);

Als we een alias programmatisch willen configureren, kunnen we ook de onderstaande code gebruiken:

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

3.2. Veld Aliassen

Stel dat we de volgende XML hebben:

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

De fn tag komt niet overeen met velden in onze Klant object, dus we zullen een alias voor dat veld moeten definiëren als we het willen deserialiseren. We kunnen dit bereiken met behulp van de volgende annotatie:

@XStreamAlias ​​("fn") private String firstName;

Als alternatief kunnen we hetzelfde doel programmatisch bereiken:

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

4. Impliciete collecties

Laten we zeggen dat we de volgende XML hebben, met een eenvoudige lijst van Contact details:

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

We willen de lijst met Contact details in een Lijst veld in ons Java-object. We kunnen dit bereiken door de volgende annotatie te gebruiken:

@XStreamImplicit privélijst contactDetailsList;

Als alternatief kunnen we hetzelfde doel programmatisch bereiken:

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

5.Negeer velden

Laten we zeggen dat we de volgende XML hebben:

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

In de XML hierboven hebben we een extra element die ontbreekt in onze Java Klant voorwerp.

Als we de bovenstaande xml proberen te deserialiseren zonder enige zorg voor extra element, gooit het programma een UnknownFieldException.

Geen veld com.baeldung.pojo.Customer.fullName

Zoals de uitzondering duidelijk aangeeft, herkent XStream het veld niet voor-en achternaam.

Om dit probleem op te lossen, moeten we het configureren om onbekende elementen te negeren:

xstream.ignoreUnknownElements ();

6. Kenmerkvelden

Stel dat we XML hebben met attributen als onderdeel van elementen die we willen deserialiseren als een veld in ons object. We zullen een contact type toe te schrijven aan onze Contact details voorwerp:

 6673543265 0124-2460311 

Als we het contact type XML-attribuut, kunnen we de @XStreamAsAttribute annotatie op het veld waarin we het willen laten verschijnen:

@XStreamAsAttribute privé String contactType;

Als alternatief kunnen we hetzelfde doel programmatisch bereiken:

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

7. Conclusie

In dit artikel hebben we de opties onderzocht die beschikbaar zijn bij het deserialiseren van XML naar Java-objecten met XStream.

De volledige broncode voor dit artikel kan worden gedownload vanuit de gekoppelde GitHub-repository.