Guia de @JsonFormat em Jackson
*1. Visão geral *
Neste artigo, tentamos entender como usar _ @ JsonFormat_ em Jackson. É uma anotação de Jackson usada para especificar como formatar campos e/ou propriedades para a saída JSON. Especificamente, esta anotação permite especificar como formatar
Especificamente, esta anotação permite especificar como formatar os valores Date e Calendar de acordo com o formato SimpleDateFormat.
===* 2. Dependência Maven *
_ @ JsonFormat_ é definido no https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.fasterxml.jackson.core%22%20AND%20a%3A%22jackson-databind% 22 [jackson-databind], por isso precisamos da seguinte dependência do Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
===* 3. Começando *
====* 3.1 Usando o formato padrão *
Para começar, demonstraremos os conceitos de uso da anotação _ @ JsonFormat_ com uma classe que representa um usuário.
Como estamos tentando explicar os detalhes da anotação, o objeto User será criado mediante solicitação (e não armazenado ou carregado em um banco de dados) e serializado para JSON:
public class User {
private String firstName;
private String lastName;
private Date createdDate = new Date();
//standard constructor, setters and getters
}
Criar e executar este exemplo de código retorna a seguinte saída:
{"firstName":"John","lastName":"Smith","createdDate":1482047026009}
Como você pode ver, o campo createdDate é mostrado como o número de segundos desde a época, que é o formato padrão usado para os campos Date.
====* 3.2 Usando a anotação em um Getter *
Vamos agora usar _ @ JsonFormat_ para especificar o formato que o campo createdDate deve ser serializado. Aqui está a classe User atualizada para essa alteração. O campo createdDate foi anotado como mostrado para especificar o formato da data.
O formato dos dados usado para o argumento pattern é especificado por _https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html [SimpleDateFormat] _:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "[email protected]:mm:ss.SSSZ")
private Date createdDate;
Com essa mudança, criamos o projeto novamente e o executamos. A saída é mostrada abaixo:
{"firstName":"John","lastName":"Smith","createdDate":"[email protected]:53:34.740+0000"}
Como você pode ver, o campo createdDate foi formatado usando o formato especificado SimpleDateFormat usando a anotação _ @ JsonFormat_.
O exemplo acima demonstra o uso da anotação em um campo. Também pode ser usado em um método getter (uma propriedade) da seguinte maneira.
Por exemplo, você pode ter uma propriedade que está sendo computada na chamada. Você pode usar a anotação no método getter nesse caso. Observe que o padrão também foi alterado para retornar apenas a parte da data do instante:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public Date getCurrentDate() {
return new Date();
}
A saída resultante é a seguinte:
{ ... , "currentDate":"2016-12-18", ...}
====* 3.3 Especificando a localidade *
Além de especificar o formato da data, você também pode especificar o código do idioma a ser usado para serialização. Não especificar este parâmetro resulta na serialização sendo executada com o código do idioma padrão:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "[email protected]:mm:ss.SSSZ", locale = "en_GB")
public Date getCurrentDate() {
return new Date();
}
====* 3.4 Especificando a forma *
O uso de _ @ JsonFormat_ com shape definido como JsonFormat.Shape.NUMBER resulta na saída padrão para Date types - como o número de segundos desde a época . O parâmetro pattern não é aplicável a este caso e é ignorado:
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
public Date getDateNum() {
return new Date();
}
A saída é como mostrado abaixo:
{ ..., "dateNum":1482054723876 }
===* 4. Conclusão*
Em conclusão, _ @ JsonFormat_ é usado para controlar o formato de saída dos tipos Date e Calendar, conforme demonstrado acima.
O código de exemplo mostrado acima está disponível over no GitHub.