XStream-Benutzerhandbuch: Konvertieren von XML in Objekte

XStream-Benutzerhandbuch: Konvertieren von XML in Objekte

1. Überblick

Inprevious article haben wir gelernt, wie man mit XStream Java-Objekte in XML serialisiert. In diesem Lernprogramm erfahren Sie, wie Sie das Gegenteil tun: XML in Java-Objekte deserialisieren. Diese Aufgaben können mithilfe von Anmerkungen oder programmgesteuert ausgeführt werden.

Informationen zu den grundlegenden Anforderungen für das Einrichten von XStream und seinen Abhängigkeiten finden Sie im vorherigen Artikel.

2. Deserialisieren Sie ein Objekt aus XML

Nehmen wir zunächst an, wir haben das folgende XML:


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

Wir müssen dies in ein JavaCustomer-Objekt konvertieren:

public class Customer {

    private String firstName;
    private String lastName;
    private Date dob;

    // standard setters and getters
}

Das XML kann auf verschiedene Arten eingegeben werden, einschließlichFile,InputStream,Reader oderString. Der Einfachheit halber nehmen wir an, dass wir das obige XML in einemString-Objekt haben.

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

3. Aliase

Im ersten Beispiel hatte das XML den vollständig qualifizierten Namen der Klasse im äußersten XML-Tag, der mit dem Speicherort unsererCustomer-Klasse übereinstimmt. Mit diesem Setup konvertiert XStream das XML ohne zusätzliche Konfiguration problemlos in unser Objekt. Aber wir haben möglicherweise nicht immer diese Bedingungen. Wir haben möglicherweise keine Kontrolle über die Benennung der XML-Tags, oder wir möchten Aliase für Felder hinzufügen.

Angenommen, wir haben unser XML so geändert, dass der vollständig qualifizierte Klassenname für das äußere Tag nicht verwendet wird:


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

Wir können dieses XML verbergen, indem wir Aliase erstellen.

3.1. Klasse Aliase

Wir registrieren Aliase entweder programmgesteuert oder mithilfe von Anmerkungen bei der XStream-Instanz. Wir können unsereCustomer-Klasse mit@XStreamAlias kommentieren:

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

Jetzt müssen wir unsere XStream-Instanz so konfigurieren, dass diese Annotation verwendet wird:

xstream.processAnnotations(Customer.class);

Wenn Sie alternativ einen Alias ​​programmgesteuert konfigurieren möchten, können Sie den folgenden Code verwenden: [line-through] **

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

3.2. Feld Aliase

Angenommen, wir haben das folgende XML:


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

Dasfn-Tag stimmt nicht mit Feldern in unseremCustomer-Objekt überein. Daher müssen wir einen Alias ​​für dieses Feld definieren, wenn wir es deserialisieren möchten. Wir können dies mit der folgenden Annotation erreichen:

@XStreamAlias("fn")
private String firstName;

Alternativ können wir das gleiche Ziel programmatisch erreichen:

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

4. Implizite Sammlungen

Nehmen wir an, wir haben das folgende XML mit einer einfachen Liste vonContactDetails:


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

Wir möchten die Liste vonContactDetails in einList<ContactDetails>-Feld in unserem Java-Objekt laden. Wir können dies erreichen, indem wir die folgende Annotation verwenden:

@XStreamImplicit
private List contactDetailsList;

Alternativ können wir das gleiche Ziel programmatisch erreichen:

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

5. Felder ignorieren

Nehmen wir an, wir haben folgendes XML:


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

In der obigen XML-Datei haben wir das zusätzliche Element<fullName>, das in unserem JavaCustomer-Objekt fehlt.

Wenn wir versuchen, die obige XML-Datei zu deserialisieren, ohne auf zusätzliche Elemente zu achten, gibt das Programm einUnknownFieldException aus.

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

Wie in der Ausnahme eindeutig angegeben, erkennt XStream das FeldfullName nicht.

Um dieses Problem zu lösen, müssen wir es so konfigurieren, dass unbekannte Elemente ignoriert werden:

xstream.ignoreUnknownElements();

6. Attributfelder

Angenommen, wir haben XML mit Attributen als Teil von Elementen, die wir als Feld in unserem Objekt deserialisieren möchten. Wir werden unseremContactDetails-Objekt eincontactType-Attribut hinzufügen:


    6673543265
    0124-2460311

Wenn wir das XML-AttributcontactTypedeserialisieren möchten, können wir die Annotation@XStreamAsAttributefür das Feld verwenden, in dem es angezeigt werden soll:

@XStreamAsAttribute
private String contactType;

Alternativ können wir das gleiche Ziel programmatisch erreichen:

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

7. Fazit

In diesem Artikel haben wir die verfügbaren Optionen zum Deserialisieren von XML in Java-Objekte mithilfe von XStream untersucht.

Der vollständige Quellcode für diesen Artikel kann von den verknüpftenGitHub repository heruntergeladen werden.