Guide de l'utilisateur XStream: Conversion de XML en objets

1. Vue d'ensemble

Dans un article précédent, nous avons appris à utiliser XStream pour sérialiser des objets Java en XML. Dans ce didacticiel, nous allons apprendre à faire l'inverse: désérialiser XML en objets Java. Ces tâches peuvent être accomplies à l'aide d'annotations ou par programme.

Pour en savoir plus sur les exigences de base pour la configuration de XStream et de ses dépendances, veuillez consulter l'article précédent.

2. Désérialiser un objet de XML

Pour commencer, supposons que nous ayons le XML suivant:

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

Nous devons le convertir en un objet client Java :

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

Le XML peut être entré de différentes manières, notamment File , InputStream , Reader ou String . Pour simplifier, nous supposerons que nous avons le XML ci-dessus dans un objet String .

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

3. Alias

Dans le premier exemple, le XML avait le nom complet de la classe dans la balise XML la plus externe, correspondant à l'emplacement de notre classe Customer . Avec cette configuration, XStream convertit facilement le XML en notre objet sans aucune configuration supplémentaire. Mais nous ne pouvons pas toujours avoir ces conditions. Nous n'avons peut-être pas le contrôle sur la dénomination des balises XML, ou nous pouvons décider d'ajouter des alias pour les champs.

Par exemple, supposons que nous ayons modifié notre XML pour ne pas utiliser le nom de classe complet pour la balise externe:

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

Nous pouvons convertir ce XML en créant des alias.

3.1. Alias ​​de classe

Nous enregistrons les alias avec l'instance XStream soit par programme, soit à l'aide d'annotations. Nous pouvons annoter notre classe Customer avec @XStreamAlias :

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

Nous devons maintenant configurer notre instance XStream pour utiliser cette annotation:

xstream.processAnnotations(Customer.class);

Alternativement, si nous souhaitons configurer un alias par programme, nous pouvons utiliser le code ci-dessous:

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

3.2. Alias ​​de champ

Supposons que nous ayons le XML suivant:

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

La balise fn ne correspond à aucun champ de notre objet Client , nous devrons donc définir un alias pour ce champ si nous souhaitons le désérialiser. Nous pouvons y parvenir en utilisant l'annotation suivante:

@XStreamAlias("fn") private String firstName;

Alternativement, nous pouvons atteindre le même objectif par programme:

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

4. Collections implicites

Disons que nous avons le XML suivant, contenant une simple liste de ContactDetails :

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

Nous voulons charger la liste de ContactDetails dans un champ List de notre objet Java. Nous pouvons y parvenir en utilisant l'annotation suivante:

@XStreamImplicit private List contactDetailsList;

Alternativement, nous pouvons atteindre le même objectif par programme:

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

5. Ignorer les champs

Disons que nous avons le XML suivant:

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

Dans le XML ci-dessus, nous avons un élément supplémentaire qui est absent de notre objet Client Java .

Si nous essayons de désérialiser le xml ci-dessus sans prendre soin de l'élément supplémentaire, le programme lève une UnknownFieldException .

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

Comme l'exception l'indique clairement, XStream ne reconnaît pas le champ fullName .

Pour surmonter ce problème, nous devons le configurer pour ignorer les éléments inconnus:

xstream.ignoreUnknownElements();

6. Champs d'attribut

Supposons que nous ayons du XML avec des attributs dans le cadre d'éléments que nous aimerions désérialiser en tant que champ dans notre objet. Nous ajouterons un attribut contactType à notre objet ContactDetails :

 6673543265 0124-2460311 

Si nous voulons désérialiser l' attribut XML contactType , nous pouvons utiliser l' annotation @XStreamAsAttribute sur le champ dans lequel nous aimerions qu'il apparaisse:

@XStreamAsAttribute private String contactType;

Alternativement, nous pouvons atteindre le même objectif par programme:

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

7. Conclusion

Dans cet article, nous avons exploré les options disponibles lors de la désérialisation du XML en objets Java à l'aide de XStream.

Le code source complet de cet article peut être téléchargé à partir du référentiel GitHub lié.