Arquitetura de Software

Conteúdo produzido pelas turmas de Arquitetura de Software - Computação @ UFCG

Documento arquitetural - Biblioteca Gson

Autores

Este documento foi produzido por Jerônimo Jairo Silva de Araújo.

Descrição Geral

O Gson é uma biblioteca Java que é usada para serializar objetos Java em suas representações JSON e para deserializar uma string JSON em um equivalente objeto Java.

Objetivo geral

  • Prover uma interface simples, onde o usuário consiga serializar/deserializar objetos em JSON (e vice-versa), facilmente, sem a necessidade de anotações (pois quando não se tem acesso ao código se torna um problema).

Objetivos específicos

  • Prover uma interface simples para realizar a serialização de objetos e deserialização de strings JSON através dos métodos toJson() e fromJson(), respectivamente.
  • Trabalhar com objetos que não se tem acesso ao código.
  • Permitir que objetos não modificáveis sejam serializáveis e deserializáveis.
  • Dar suporte à Java Generics e objetos arbitrariamente complexos (que contém alto nível de herança e uso extensivo de Generics Types).
  • Permitir representações customizáveis de objetos.

Agora será dada uma visão do projeto utilizando o modelo C4.

Contexto

O Gson é uma biblioteca Java, que é comente utilizado em programas que tem necessidade de fazer conversões de objetos para JSON, ou vice-versa.

Um das suas principais utilizações (e onde tive contato), são em aplicações RESTApi que recebem e enviam JSON em seus endpoints. Assim, é comum fazer a deserialização de um JSON que chega na requisição e, posteriormente, uma serialização para a criação de um JSON que será enviado como resposta.

Abaixo, um simples exemplo de contexto que pode ser encontrado o Gson:

Diagrama de contexto do Gson

Containers

Para essa parte, serão considerados como obtemos um objeto Gson para realizar as chamadas toJson e fromJson. Para isso, temos dois métodos de criação de um objeto Gson:

  • Através da instanciação direta de um objeto Gson, que tem as configurações padrões de um objeto Gson. A sua instanciação é feita da seguinte forma:
    Gson gson = new Gson();
    
  • Através de um GsonBuilder, que ajuda a fazer uma criação customizável do objeto Gson, configurando coisas como: versionamento, impressão bonita e customizáveis dos JsonSerializers, JsonDeserializers e InstancesCreators. A criação através do builder pode ser feita da seguinte maneira:
    Gson gson = new GsonBuilder()
       .registerTypeAdapter(Id.class, new IdTypeAdapter())
       .enableComplexMapKeySerialization()
       .serializeNulls()
       .setDateFormat(DateFormat.LONG)
       .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
       .setPrettyPrinting()
       .setVersion(1.0)
       // creates a Gson instance with the configurations 
       // set into the GsonBuilder
       .create();
    

Assim, podemos ter dois “containers”, que dão acesso a criação de Gson e sua utilização futura:

Diagrama de containers do Gson

Componentes

Agora, o container que será “aberto” é do Gson. Nele que há todas as chamadas que fazer acontecer as serializações e deserializações, respectivamente, através dos métodos toJson e fromJson.

A seguir, uma exemplo de como um serialização/deserialização pode ser feita:

// Também pode ser utilizado new GsonBuilder().create();
Gson gson = new Gson();
// O objeto que será serializado
MyType target = new MyType();
// Serializa o target para um Json
String json = gson.toJson(target);
// Deserializa o Json para um objeto do tipo passado
MyType target2 = gson.fromJson(json, MyType.class);

A partir do objeto MyType, é feita a serialização chamando o método toJson do Gson, que ao final returna uma JSON string. Depois é o processo contrário, pois iremos deserializar a string JSON de volta para um objeto do tipo MyType. Para isso, é chamado o método fromJson com a string JSON e o tipo que se espera que o JSON seja. Ao final, será retornado um objeto do tipo MyType.

Dentro do Gson são feitas várias coisas quando chamamos cada um desses métodos, e abaixo temos uma representação disso:

Diagrama de componentes do Gson

Código

Nesta etapa não faremos diagramas que apresentam detalhes da
implementação. Faremos isso mais adiante.

Visão de informação

A seguir, será apresentado como acontece a serialização (toJson) de um objeto, para uma string Json. Será apresentado, desde a criação de um objeto Gson, até o retorno de uma string Json.

Diagrama de informação do Gson