Руководство пользователя XStream: преобразование XML в объекты

Руководство пользователя XStream: преобразование XML в объекты

1. обзор

Вprevious article мы узнали, как использовать XStream для сериализации объектов Java в XML. В этом уроке мы узнаем, как сделать обратное: десериализовать XML в объекты Java. Эти задачи могут быть выполнены с использованием аннотаций или программно.

Чтобы узнать об основных требованиях для настройки XStream и его зависимостях, обратитесь к предыдущей статье.

2. Десериализовать объект из XML

Для начала предположим, что у нас есть следующий XML:


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

Нам нужно преобразовать это в объект JavaCustomer:

public class Customer {

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

    // standard setters and getters
}

XML может быть введен несколькими способами, включаяFile,InputStream,Reader илиString. Для простоты предположим, что приведенный выше XML есть в объектеString.

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

3. Псевдонимы

В первом примере XML имел полное имя класса во внешнем теге XML, совпадающее с местоположением нашего классаCustomer. С этой настройкой XStream легко конвертирует XML в наш объект без какой-либо дополнительной настройки. Но у нас не всегда могут быть такие условия. Возможно, у нас нет контроля над именованием тегов XML или мы можем решить добавить псевдонимы для полей.

Например, предположим, что мы изменили наш XML, чтобы не использовать полное имя класса для внешнего тега:


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

Мы можем скрыть этот XML, создав псевдонимы.

3.1. Псевдонимы классов

Мы регистрируем псевдонимы в экземпляре XStream либо программно, либо с помощью аннотаций. Мы можем аннотировать наш классCustomer с помощью@XStreamAlias:

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

Теперь нам нужно настроить наш экземпляр XStream для использования этой аннотации:

xstream.processAnnotations(Customer.class);

В качестве альтернативы, если мы хотим настроить псевдоним программно, мы можем использовать следующий код: [сквозная строка] **

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

3.2. Псевдонимы полей

Предположим, у нас есть следующий XML:


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

Тегfn не соответствует ни одному полю в нашем объектеCustomer, поэтому нам нужно будет определить псевдоним для этого поля, если мы хотим десериализовать его. Мы можем добиться этого, используя следующую аннотацию:

@XStreamAlias("fn")
private String firstName;

В качестве альтернативы, мы можем достичь той же цели программно:

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

4. Неявные коллекции

Допустим, у нас есть следующий XML-код, содержащий простой списокContactDetails:


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

Мы хотим загрузить списокContactDetails в полеList<ContactDetails> в нашем Java-объекте. Мы можем добиться этого, используя следующую аннотацию:

@XStreamImplicit
private List contactDetailsList;

В качестве альтернативы, мы можем достичь той же цели программно:

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

5. Игнорировать поля

Допустим, у нас есть следующий XML:


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

В приведенном выше XML у нас есть дополнительный элемент<fullName>, который отсутствует в нашем объекте JavaCustomer.

Если мы попытаемся десериализовать указанный выше xml, не заботясь о дополнительных элементах, программа выдастUnknownFieldException.

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

Как ясно указано в исключении, XStream не распознает полеfullName.

Чтобы преодолеть эту проблему, нам нужно настроить ее так, чтобы она игнорировала неизвестные элементы:

xstream.ignoreUnknownElements();

6. Поля атрибутов

Предположим, у нас есть XML с атрибутами как часть элементов, которые мы хотим десериализовать как поле в нашем объекте. Мы добавим атрибутcontactType к нашему объектуContactDetails:


    6673543265
    0124-2460311

Если мы хотим десериализовать атрибут XMLcontactType, мы можем использовать аннотацию@XStreamAsAttribute в поле, в котором мы хотим, чтобы оно отображалось:

@XStreamAsAttribute
private String contactType;

В качестве альтернативы, мы можем достичь той же цели программно:

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

7. Заключение

В этой статье мы рассмотрели варианты, доступные при десериализации XML для объектов Java с использованием XStream.

Полный исходный код этой статьи можно загрузить по ссылкеGitHub repository.