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.