1. Обзор
В этом руководстве мы покажем, как использовать @JsonFormat
в Джексоне.
@JsonFormat
— это аннотация Джексона, которую мы используем, чтобы указать, как форматировать поля и/или свойства для вывода JSON.
В частности, эта аннотация позволяет нам указать, как форматировать значения даты
и календаря
в соответствии с форматом SimpleDateFormat .
2. Зависимость от Maven
@JsonFormat
определен в пакете jackson -databind , поэтому нам нужна следующая зависимость Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
3. Начало работы
3.1. Использование формата по умолчанию
Мы начнем с демонстрации концепций использования аннотации @JsonFormat
с классом, представляющим пользователя.
Поскольку мы хотим объяснить детали аннотации, объект User
будет создан по запросу (а не сохранен или загружен из базы данных) и сериализован в JSON:
public class User {
private String firstName;
private String lastName;
private Date createdDate = new Date();
// standard constructor, setters and getters
}
Сборка и запуск этого примера кода возвращает следующий результат:
{"firstName":"John","lastName":"Smith","createdDate":1482047026009}
Как мы видим, поле createdDate
отображается как количество секунд с начала эпохи, что является форматом по умолчанию, используемым для полей Date .
3.2. Использование аннотации в геттере
Теперь мы будем использовать @JsonFormat
, чтобы указать формат для сериализации поля createdDate
.
Давайте посмотрим на класс User, обновленный для этого изменения. Мы аннотируем поле createdDate
, как показано, чтобы указать формат даты.
Формат данных, используемый для аргумента шаблона
, определяется SimpleDateFormat
:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ")
private Date createdDate;
После внесения этого изменения мы снова создаем проект и запускаем его.
И это вывод:
{"firstName":"John","lastName":"Smith","createdDate":"2016-12-18@07:53:34.740+0000"}
Здесь мы отформатировали поле createdDate,
используя указанный формат SimpleDateFormat , используя аннотацию
@JsonFormat
.
В приведенном выше примере показано использование аннотации к полю. Мы также можем использовать его в методе получения (свойство).
Например, у нас может быть свойство, которое вычисляется при вызове. В таком случае мы можем использовать аннотацию метода получения.
Обратите внимание, что мы также изменили шаблон, чтобы возвращать только часть даты момента:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public Date getCurrentDate() {
return new Date();
}
И вот результат:
{ ... , "currentDate":"2016-12-18", ...}
3.3. Указание локали
Помимо указания формата даты, мы также можем указать локаль для сериализации.
Не указание этого параметра приводит к выполнению сериализации с локалью по умолчанию:
@JsonFormat(
shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ", locale = "en_GB")
public Date getCurrentDate() {
return new Date();
}
3.4. Указание формы
Использование @JsonFormat
с формой
, для которой задано значение JsonFormat.Shape.NUMBER
, приводит к выводу по умолчанию для типов Date
— как количество секунд с начала эпохи .
Шаблон
параметра неприменим к этому случаю и игнорируется:
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
public Date getDateNum() {
return new Date();
}
Посмотрим на вывод:
{ ..., "dateNum":1482054723876 }
4. Вывод
Подводя итог, мы используем @JsonFormat
для управления форматом вывода типов Date
и Calendar
.
Пример кода, показанный выше, доступен на GitHub .