Перейти к основному содержимому

Форматирование дат JSON в Spring Boot

· 3 мин. чтения

1. Обзор

В этом руководстве мы покажем, как форматировать поля даты JSON в приложении Spring Boot.

Мы рассмотрим различные способы форматирования дат с помощью Jackson , который Spring Boot использует в качестве процессора JSON по умолчанию.

2. Использование @JsonFormat в поле даты

2.1. Настройка формата

Мы можем использовать аннотацию @JsonFormat для форматирования определенного поля :

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

}

В поле дня рождения мы используем шаблон, который отображает только дату, а в поле lastUpdate мы также включаем время.

Мы использовали типы даты Java 8 , которые очень удобны для работы с временными типами.

Конечно, если нам нужно использовать устаревшие типы, такие как java.util.Date , мы можем использовать аннотацию таким же образом:

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
}

Наконец, давайте посмотрим на вывод, полученный с помощью @JsonFormat с заданным форматом даты:

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

Как мы видим, использование аннотации @JsonFormat — отличный способ отформатировать конкретное поле даты.

Однако мы должны использовать его только тогда, когда нам нужно особое форматирование полей. Если мы хотим иметь общий формат для всех дат в нашем приложении, есть лучшие способы добиться этого, как мы увидим позже.

2.2. Установка часового пояса

Если нам нужно использовать определенный часовой пояс, мы можем установить атрибут часового пояса @ JsonFormat :

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

Нам не нужно использовать его, если тип уже содержит часовой пояс, например, с java.time.ZonedDatetime .

3. Настройка формата по умолчанию

Хотя @JsonFormat сам по себе является мощным инструментом, жесткое кодирование формата и часового пояса может привести к тому, что мы столкнемся с трудностями.

Если мы хотим настроить формат по умолчанию для всех дат в нашем приложении, более гибкий способ — настроить его в application.properties :

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

И если мы хотим использовать определенный часовой пояс в наших датах JSON, для этого также есть свойство:

spring.jackson.time-zone=Europe/Zagreb

Хотя установка такого формата по умолчанию довольно удобна и проста, у этого подхода есть недостаток. К сожалению, он не работает с типами даты Java 8 , такими как LocalDate и LocalDateTime . Мы можем использовать его только для форматирования полей типа java.util.Date или java.util.Calendar . Однако надежда есть, как мы скоро увидим.

4. Настройка ObjectMapper Джексона ``

Итак, если мы хотим использовать типы даты Java 8 и установить формат даты по умолчанию, нам нужно взглянуть на создание 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)));
};
}

}

В приведенном выше примере показано, как настроить формат по умолчанию в нашем приложении. Мы должны определить компонент и переопределить его метод настройки , чтобы установить желаемый формат.

Хотя этот подход может показаться немного громоздким, приятно то, что он работает как для Java 8, так и для устаревших типов дат.

5. Вывод

В этой статье мы рассмотрели несколько способов форматирования дат JSON в приложении Spring Boot.

Как всегда, исходный код примеров можно найти на GitHub .