Article image
Josué Oliveira
Josué Oliveira03/05/2023 00:27
Share

Simplificando a Integração de Dados em Java com JSON e Anotações Jackson

  • #Java
  • #API Rest

Jackson é uma biblioteca popular em Java usada para trabalhar com dados JSON. Ela fornece um conjunto de anotações que podem ser usadas para personalizar a serialização e deserialização de objetos Java para e de JSON.

JSON (JavaScript Object Notation) é um formato de dados leve e popular usado para armazenar e trocar dados entre aplicativos e sistemas. Ele foi originalmente derivado da linguagem JavaScript, mas agora é uma notação de dados independente de linguagem que pode ser usada em qualquer plataforma ou linguagem de programação.

Os dados em JSON são representados como objetos que consistem em pares de chave-valor, separados por vírgulas e envolvidos em chaves { }. Os valores podem ser strings, números, booleanos, arrays, outros objetos JSON ou nulos. Um exemplo simples um objeto JSON:

{

   "nome": "Josué",

   "idade": 40,

   "solteiro": false,

   "interesses": ["Música", "Tecnologia", "viagens"],

   "endereco": {

      "rua": "Rua sem nome",

      "cidade": "São Luís",

      "pais": "Brasil"

   }

}

O JSON é amplamente utilizado em aplicativos web para transmitir dados entre um cliente e um servidor, mas também pode ser usado em outros tipos de aplicativos, como aplicativos móveis e de desktop. Como o JSON é um formato de dados simples e fácil de entender, é popular em muitas áreas diferentes da computação.

A serialização é o processo de converter um objeto Java em um formato de dados que possa ser armazenado ou transmitido, como JSON. A deserialização é o processo inverso, que envolve a conversão do formato de dados (como JSON) de volta para um objeto Java. 

Personalizar a serialização e deserialização significa ter o controle sobre como esses processos ocorrem e como o objeto Java é convertido em JSON e vice-versa.

Com as anotações do Jackson, é possível personalizar a serialização e deserialização de objetos Java para e de JSON de várias formas, como:

  • Definindo quais campos devem ser incluídos ou excluídos da serialização.
  • Alterando o nome de propriedades e campos em JSON.
  • Definindo o formato de datas e horários em JSON.
  • Personalizando o comportamento da serialização e deserialização para casos especiais.

Vamos destacar um pouco o último item acima: Personalizando o comportamento da serialização e deserialização para casos especiais. Um exemplo de personalização da serialização e deserialização de um objeto Java usando Jackson annotations para um caso especial:

Suponha que você tenha um objeto Person com os campos name, age e email, e você quer que o campo email só seja incluído na serialização se tiver um valor não nulo. Além disso, você quer que a deserialização aceite o campo idade ou age (em inglês ou português) como sinônimos, e que ignore qualquer outro campo que não esteja presente no objeto Person.

Para personalizar esse comportamento, você pode usar as seguintes anotações do Jackson:

public class Person {

   private String name;

   private int age;

   private String email;

   @JsonProperty("name")

   public String getName() {

      return name;

   }

   @JsonProperty("name")

   public void setName(String name) {

      this.name = name;

   }

   @JsonProperty("age")

   @JsonAlias("idade")

   public int getAge() {

      return age;

   }

   @JsonProperty("age")

   @JsonAlias("idade")

   public void setAge(int age) {

      this.age = age;

   }

   @JsonProperty("email")

   @JsonInclude(JsonInclude.Include.NON_NULL)

   public String getEmail() {

      return email;

   }

   @JsonProperty("email")

   public void setEmail(String email) {

      this.email = email;

   }

   @JsonAnySetter

   public void handleUnknown(String key, Object value) {

      // ignore any unknown fields

   }

}

Acima, estamos usando a anotação @JsonAlias para especificar que o campo age pode ser representado como age ou idade em JSON. Também estamos usando a anotação @JsonInclude para garantir que o campo email só seja incluído na serialização se tiver um valor não nulo. Além disso, estamos usando o método handleUnknown com a anotação @JsonAnySetter para ignorar quaisquer campos desconhecidos durante a deserialização.

Com essas anotações, a serialização e deserialização do objeto Person serão personalizadas para se comportar como especificado acima.

Ao personalizar a serialização e deserialização, é possível garantir que o JSON gerado ou lido seja compatível com outros sistemas ou bibliotecas que esperam um determinado formato de dados. Também pode ajudar a melhorar a eficiência do armazenamento ou da transmissão de dados, removendo campos desnecessários ou reduzindo a quantidade de dados necessários para representar um objeto Java em JSON.

Algumas das anotações do Jackson mais comumente usadas incluem:

  • @JsonProperty: usada para mapear uma propriedade JSON para um campo de classe Java ou método getter/setter.
  • @JsonCreator: usada para especificar um construtor ou método de fábrica personalizado para deserializar JSON em um objeto Java.
  • @JsonIgnore: usada para ignorar um campo ou método durante a serialização e deserialização.
  • @JsonInclude: usada para especificar quando um campo deve ser incluído na saída serializada (por exemplo, incluir apenas valores não nulos).

…e muitos mais!

As anotações do Jackson são uma ferramenta poderosa para personalizar a serialização e deserialização de dados JSON em aplicativos Java. É importante investir um pouco de tempo para entender como suas aplicações e sua produtividade podem ganhar com isso. 

Sugestão como fonte de pesquisa e leitura:

https://www.baeldung.com/jackson

https://www.baeldung.com/jackson-annotations

https://www.baeldung.com/jackson-advanced-annotations

Crédito da imagem da capa: GP Coder.

Share
Comments (0)