XStream User Guide: Convertendo XML em objetos
1. Visão geral
Em umprevious article, aprendemos como usar XStream para serializar objetos Java para XML. Neste tutorial, aprenderemos como fazer o inverso: desserializar XML para objetos Java. Essas tarefas podem ser realizadas usando anotações ou programaticamente.
Para aprender sobre os requisitos básicos para configurar o XStream e suas dependências, consulte o artigo anterior.
2. Desserializar um objeto de XML
Para começar, suponha que tenhamos o seguinte XML:
John
Doe
1986-02-14 03:46:16.381 UTC
Precisamos converter isso em um objeto JavaCustomer:
public class Customer {
private String firstName;
private String lastName;
private Date dob;
// standard setters and getters
}
O XML pode ser inserido de várias maneiras, incluindoFile,InputStream,Reader ouString. Para simplificar, vamos supor que temos o XML acima em um objetoString.
Customer convertedCustomer = (Customer) xstream.fromXML(customerXmlString);
Assert.assertTrue(convertedCustomer.getFirstName().equals("John"));
3. Apelido
No primeiro exemplo, o XML tinha o nome totalmente qualificado da classe na tag XML mais externa, correspondendo à localização de nossa classeCustomer. Com essa configuração, o XStream converte facilmente o XML em nosso objeto sem nenhuma configuração extra. Mas nem sempre temos essas condições. Podemos não ter controle sobre a nomenclatura da marca XML ou decidir adicionar aliases para os campos.
Por exemplo, suponha que modificamos nosso XML para não usar o nome completo da classe para a tag externa:
John
Doe
1986-02-14 03:46:16.381 UTC
Podemos esconder esse XML criando aliases.
3.1. Aliases de classe
Registramos aliases na instância XStream de forma programática ou usando anotações. Podemos anotar nossa classeCustomer com@XStreamAlias:
@XStreamAlias("customer")
public class Customer {
//...
}
Agora precisamos configurar nossa instância do XStream para usar esta anotação:
xstream.processAnnotations(Customer.class);
Como alternativa, se desejarmos configurar um alias programaticamente, podemos usar o código abaixo: [line-through] **
xstream.alias("customer", Customer.class);
3.2. Aliases de campo
Suponha que tenhamos o seguinte XML:
John
Doe
1986-02-14 03:46:16.381 UTC
A tagfn não corresponde a nenhum campo em nosso objetoCustomer, então precisaremos definir um alias para esse campo se desejarmos desserializá-lo. Podemos conseguir isso usando a seguinte anotação:
@XStreamAlias("fn")
private String firstName;
Como alternativa, podemos alcançar o mesmo objetivo programaticamente:
xstream.aliasField("fn", Customer.class, "firstName");
4. Coleções implícitas
Digamos que temos o seguinte XML, contendo uma lista simples deContactDetails:
John
Doe
1986-02-14 04:14:20.541 UTC
6673543265
0124-2460311
...
Queremos carregar a lista deContactDetails em um campoList<ContactDetails> em nosso objeto Java. Podemos conseguir isso usando a seguinte anotação:
@XStreamImplicit
private List contactDetailsList;
Como alternativa, podemos alcançar o mesmo objetivo programaticamente:
xstream.addImplicitCollection(Customer.class, "contactDetailsList");
5. Ignorar Campos
Digamos que temos o seguinte XML:
John
Doe
1986-02-14 04:14:20.541 UTC
John Doe
No XML acima, temos o elemento extra<fullName> que está faltando em nosso objeto JavaCustomer.
Se tentarmos desserializar o xml acima sem tomar cuidado com o elemento extra, o programa lançará umUnknownFieldException.
No such field com.example.pojo.Customer.fullName
Como a exceção afirma claramente, o XStream não reconhece o campofullName.
Para superar esse problema, precisamos configurá-lo para ignorar elementos desconhecidos:
xstream.ignoreUnknownElements();
6. Campos de Atributo
Suponha que temos XML com atributos como parte de elementos que gostaríamos de desserializar como um campo em nosso objeto. Vamos adicionar um atributocontactType ao nosso objetoContactDetails:
6673543265
0124-2460311
Se quisermos desserializar o atributo XMLcontactType, podemos usar a anotação@XStreamAsAttribute no campo que desejamos que apareça em:
@XStreamAsAttribute
private String contactType;
Como alternativa, podemos alcançar o mesmo objetivo programaticamente:
xstream.useAttributeFor(ContactDetails.class, "contactType");
7. Conclusão
Neste artigo, exploramos as opções que temos disponíveis ao desserializar objetos XML para Java usando o XStream.
O código-fonte completo deste artigo pode ser baixado do linkGitHub repository.