Guia do Usuário do XStream: JSON

Guia do Usuário do XStream: JSON

1. Visão geral

Este é o terceiro artigo de uma série sobre o XStream. Se você deseja aprender sobre seu uso básico emconverting Java objects to XMLevice versa, consulte os artigos anteriores.

Além de seus recursos de manipulação de XML, o XStream também pode converter objetos Java de e para JSON. Neste tutorial, aprenderemos sobre esses recursos.

2. Pré-requisitos

Antes de ler este tutorial, vá até o link: / xstream-serialize-object-to-xml, no qual explicamos os fundamentos da biblioteca.

3. Dependências


    com.thoughtworks.xstream
    xstream
    1.4.5

4. Drivers JSON

Nos artigos anteriores, aprendemos como configurar uma instância do XStream e selecionar um driver XML. Da mesma forma, há dois drivers disponíveis para converter objetos de e para JSON:JsonHierarchicalStreamDrivereJettisonMappedXmlDriver.

4.1. JsonHierarchicalStreamDriver

Essa classe de driver pode serializar objetos para JSON, mas não é capaz de desserializar novamente para objetos. Ele não requer nenhuma dependência extra e sua classe de driver é independente.

4.2. JettisonMappedXmlDriver

Essa classe de driver é capaz de converter JSON para e de objetos. Usando esta classe de driver, precisamos adicionar uma dependência extra parajettison.


    org.codehaus.jettison
    jettison
    1.3.7

5. Serializando um objeto para JSON

Vamos criar uma classeCustomer:

public class Customer {

    private String firstName;
    private String lastName;
    private Date dob;
    private String age;
    private List contactDetailsList;

    // getters and setters
}

Observe que criamos (talvez inesperadamente)age comoString. Explicaremos essa escolha mais tarde.

5.1. UsandoJsonHierarchicalStreamDriver

Vamos passar umJsonHierarchicalStreamDriver para criar uma instância XStream.

xstream = new XStream(new JsonHierarchicalStreamDriver());
dataJson = xstream.toXML(customer);

Isso gera o seguinte JSON:

{
  "com.example.pojo.Customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:22:18.186 UTC",
    "age": "30",
    "contactDetailsList": [
      {
        "mobile": "6673543265",
        "landline": "0124-2460311"
      },
      {
        "mobile": "4676543565",
        "landline": "0120-223312"
      }
    ]
  }
}

5.2. Implementação deJettisonMappedXmlDriver

Vamos passar uma classeJettisonMappedXmlDriver para criar uma instância.

xstream = new XStream(new JettisonMappedXmlDriver());
dataJson = xstream.toXML(customer);

Isso gera o seguinte JSON:

{
  "com.example.pojo.Customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:25:50.745 UTC",
    "age": 30,
    "contactDetailsList": [
      {
        "com.example.pojo.ContactDetails": [
          {
            "mobile": 6673543265,
            "landline": "0124-2460311"
          },
          {
            "mobile": 4676543565,
            "landline": "0120-223312"
          }
        ]
      }
    ]
  }
}

5.3. Análise

Com base na saída dos dois drivers, podemos ver claramente que existem algumas pequenas diferenças no JSON gerado. Por exemplo,JettisonMappedXmlDriver omite as aspas duplas para valores numéricos, apesar do tipo de dados serjava.lang.String: __

"mobile": 4676543565,
"age": 30,

JsonHierarchicalStreamDriver, por outro lado, mantém as aspas duplas. __

6. Desserializando JSON para um objeto

Vamos pegar o seguinte JSON para convertê-lo de volta em um objetoCustomer:

{
  "customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:41:01.987 UTC",
    "age": 30,
    "contactDetailsList": [
      {
        "com.example.pojo.ContactDetails": [
          {
            "mobile": 6673543265,
            "landline": "0124-2460311"
          },
          {
            "mobile": 4676543565,
            "landline": "0120-223312"
          }
        ]
      }
    ]
  }
}

Lembre-se de que apenas um dos drivers (JettisonMappedXMLDriver) pode desserializar JSON. A tentativa de usar_ _JsonHierarchicalStreamDriver para esse propósito resultará emUnsupportedOperationException.

Usando o driver Jettison, podemos desserializar o objetoCustomer:

customer = (Customer) xstream.fromXML(dataJson);

7. Conclusão

Neste artigo, abordamos os recursos de manipulação de JSON XStream, convertendo objetos para e de JSON. Também vimos como podemos ajustar nossa saída JSON, tornando-a mais curta, mais simples e mais legível.

Tal como acontece com o processamento XML do XStream, existem outras maneiras de personalizar ainda mais a maneira como o JSON é serializado configurando a instância, usando anotações ou configuração programática. Para obter mais detalhes e exemplos, consulte ofirst article in this series.

O código-fonte completo com exemplos pode ser baixado emlinked GitHub repository.