Руководство пользователя 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.