XStream User Guide: Convertendo XML em objetos

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.