Formattazione delle date JSON in Spring Boot

1. Panoramica

In questo tutorial, mostreremo come formattare i campi data JSON in un'applicazione Spring Boot.

Esploreremo vari modi di formattare le date utilizzando Jackson , che viene utilizzato da Spring Boot come processore JSON predefinito.

2. Utilizzo di @JsonFormat su un campo data

2.1. Impostazione del formato

Possiamo usare l' annotazione @JsonFormat per formattare un campo specifico :

public class Contact { // other fields @JsonFormat(pattern="yyyy-MM-dd") private LocalDate birthday; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime lastUpdate; // standard getters and setters }

Nel campo del compleanno , utilizziamo un pattern che rende solo la data mentre nel campo lastUpdate includiamo anche l'ora.

Abbiamo utilizzato i tipi di data Java 8 che sono molto utili per gestire i tipi temporali. Ovviamente, se dobbiamo usare i tipi legacy come java.util.Date, possiamo usare l'annotazione allo stesso modo:

public class ContactWithJavaUtilDate { // other fields @JsonFormat(pattern="yyyy-MM-dd") private Date birthday; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date lastUpdate; // standard getters and setters }

Infine, diamo un'occhiata all'output reso utilizzando @JsonFormat con il formato data specificato:

{ "birthday": "2019-02-03", "lastUpdate": "2019-02-03 10:08:02" }

Come possiamo vedere, l' utilizzo dell'annotazione @JsonFormat è un modo eccellente per formattare un particolare campo data.

Tuttavia, dovremmo usarlo solo quando abbiamo bisogno di una formattazione specifica per i campi. Se vogliamo avere un formato generale per tutte le date nella nostra applicazione, ci sono modi migliori per ottenerlo, come vedremo più avanti.

2.2. Impostazione del fuso orario

Inoltre, se dobbiamo utilizzare un particolare fuso orario, possiamo impostare l' attributo timezone di @ JsonFormat:

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb") private LocalDateTime lastUpdate;

Non è necessario utilizzarlo se un tipo contiene già il fuso orario, ad esempio con java.time.ZonedDatetime.

3. Configurazione del formato predefinito

E mentre @JsonFormat è potente da solo, l'hardcoding del formato e del fuso orario può morderci lungo la strada.

Se vogliamo configurare un formato predefinito per tutte le date nella nostra applicazione, un modo più flessibile è configurarlo in application.properties :

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

E se vogliamo utilizzare un fuso orario specifico nelle nostre date JSON, c'è anche una proprietà per questo:

spring.jackson.time-zone=Europe/Zagreb

Sebbene l'impostazione del formato predefinito in questo modo sia abbastanza pratica e semplice, questo approccio presenta uno svantaggio. Sfortunatamente, non funziona con i tipi di data di Java 8 , come LocalDate e LocalDateTime: possiamo usarlo solo per formattare i campi del tipo java.util.Date o java.util.Calendar . C'è speranza, però, come vedremo presto.

4. Personalizzazione dell'ObjectMapper di Jackson

Quindi, se vogliamo utilizzare i tipi di data Java 8 e impostare un formato di data predefinito, dobbiamo guardare alla creazione di un bean Jackson2ObjectMapperBuilderCustomizer :

@Configuration public class ContactAppConfig { private static final String dateFormat = "yyyy-MM-dd"; private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; @Bean public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { return builder -> { builder.simpleDateFormat(dateTimeFormat); builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat))); builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat))); }; } }

L'esempio sopra mostra come configurare un formato predefinito nella nostra applicazione. Dobbiamo definire un bean e sovrascrivere il suo metodo di personalizzazione per impostare il formato desiderato.

Sebbene questo approccio possa sembrare un po 'macchinoso, la cosa bella è che funziona sia per Java 8 che per i tipi di data legacy.

5. conclusione

In questo articolo, abbiamo esplorato diversi modi per formattare le date JSON in un'applicazione Spring Boot.

Come sempre, possiamo trovare il codice sorgente per gli esempi su GitHub.