Formatering af JSON-datoer i Spring Boot

1. Oversigt

I denne vejledning viser vi, hvordan du formaterer JSON-datofelter i en Spring Boot-applikation.

Vi undersøger forskellige måder at formatere datoer ved hjælp af Jackson, som bruges af Spring Boot som standard JSON-processor.

2.Ved brug af @JsonFormat på en Dato Mark

2.1. Indstilling af format

Vi kan bruge @JsonFormat kommentar for at formatere et bestemt felt:

offentlig klasse Kontakt {// andre felter @JsonFormat (mønster = "åååå-MM-dd") privat LocalDate fødselsdag; @JsonFormat (mønster = "åååå-MM-dd HH: mm: ss") privat LocalDateTime lastUpdate; // standard getters og setter}

På den fødselsdag felt, bruger vi et mønster, der kun gengiver datoen, mens vi er på sidste ændring felt inkluderer vi også tiden.

Vi brugte Java 8 dato typer som er ret praktiske til at håndtere tidsmæssige typer. Selvfølgelig, hvis vi har brug for de ældre typer som java.util.Date, vi kan bruge kommentaren på samme måde:

offentlig klasse ContactWithJavaUtilDate {// andre felter @JsonFormat (mønster = "åååå-MM-dd") privat Dato fødselsdag; @JsonFormat (mønster = "åååå-MM-dd HH: mm: ss") privat Dato sidsteopdatering; // standard getters og setter}

Lad os endelig se på det output, der er gengivet ved hjælp af @JsonFormat med det givne datoformat:

{"fødselsdag": "2019-02-03", "lastUpdate": "2019-02-03 10:08:02"}

Som vi kan se, ved hjælp af @JsonFormat kommentar er en glimrende måde at formatere et bestemt datofelt på.

Vi skal dog kun bruge det, når vi har brug for specifik formatering til felter. Hvis vi vil have et generelt format til alle datoer i vores ansøgning, er der bedre måde at opnå dette på, som vi vil se senere.

2.2. Indstilling af tidszone

Også, hvis vi har brug for en bestemt tidszone, kan vi indstille tidszone attribut for @JsonFormat:

@JsonFormat (mønster = "åååå-MM-dd HH: mm: ss", tidszone = "Europa / Zagreb") privat LocalDateTime lastUpdate;

Vi behøver ikke bruge det, hvis en type allerede indeholder tidszonen, for eksempel med java.time.ZonedDatetime.

3. Konfiguration af standardformat

Og mens @JsonFormat er kraftfuldt alene, og hårdkodning af formatet og tidszonen kan bide os ned ad vejen.

Hvis vi vil konfigurere et standardformat til alle datoer i vores applikation, en mere fleksibel måde er at konfigurere den i application.properties:

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

Og hvis vi vil bruge en bestemt tidszone i vores JSON-datoer, er der også en egenskab til det:

spring.jackson.time-zone = Europa / Zagreb

Selvom indstilling af standardformat som dette er ret praktisk og ligetil, der er en ulempe ved denne tilgang. Desværre fungerer det ikke med Java 8-datatyperne, synes godt om LocalDate og LocalDateTime - vi kan kun bruge det til at formatere felter af typen java.util.Date eller den java.util.Kalender. Der er dog håb, som vi snart vil se.

4. Tilpasning af Jacksons ObjectMapper

Så hvis vi ønsker at bruge Java 8 dato typer og indstil et standarddatoformat, så skal vi se på oprettelse af en Jackson2ObjectMapperBuilderCustomizer bønne:

@Configuration offentlig klasse ContactAppConfig {privat statisk endelig String dateFormat = "åååå-MM-dd"; privat statisk endelig String dateTimeFormat = "åååå-MM-dd HH: mm: ss"; @Bean offentlig Jackson2ObjectMapperBuilderCustomizer jsonCustomizer () {returbygger -> {builder.simpleDateFormat (dateTimeFormat); builder.serializers (ny LocalDateSerializer (DateTimeFormatter.ofPattern (dateFormat))); builder.serializers (ny LocalDateTimeSerializer (DateTimeFormatter.ofPattern (dateTimeFormat))); }; }}

Ovenstående eksempel viser, hvordan man konfigurerer et standardformat i vores applikation. Vi er nødt til at definere en bønne og tilsidesætte dens tilpasse metode til at indstille det ønskede format.

Selvom denne tilgang måske ser lidt besværlig ud, er den pæne ting ved den, at den fungerer for både Java 8 og de ældre datatyper.

5. Konklusion

I denne artikel undersøgte vi en række forskellige måder at formatere JSON-datoer i en Spring Boot-applikation.

Som altid kan vi finde kildekoden til eksemplerne på GitHub.