1. Обзор
В этой статье мы попытаемся понять, как использовать @JsonFormat в Jackson. Это аннотация Джексона, которая используется для указания того, как форматировать поля и/или свойства для вывода JSON.
В частности, эта аннотация позволяет указать, как форматировать значения Date и Calendar в соответствии с форматом SimpleDateFormat .
2. Зависимость Maven
@JsonFormat определен в пакете jackson-databind , поэтому нам нужна следующая зависимость Maven:
com.fasterxml.jackson.core jackson-databind 2.11.1
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 должно быть сериализовано. Вот класс пользователя, обновленный для этого изменения. Поле CreatedDate было аннотировано, как показано на рисунке, чтобы указать формат даты.
Формат данных, используемый для аргумента pattern , задается параметром SimpleDateFormat :
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "[email protected]:mm:ss.SSSZ") private Date createdDate;
С этим изменением мы снова создаем проект и запускаем его. Результат показан ниже:
{"firstName":"John","lastName":"Smith","createdDate":"2016-12[email protected]:53:34.740+0000"}
Как вы можете видеть, поле CreatedDate было отформатировано с использованием указанного формата SimpleDateFormat с использованием аннотации @JsonFormat .
Приведенный выше пример демонстрирует использование аннотации на поле. Он также может быть использован в методе получения (свойстве) следующим образом.
Например, у вас может быть свойство, которое вычисляется при вызове. В таком случае вы можете использовать аннотацию к методу getter. Обратите внимание, что шаблон также был изменен, чтобы возвращать только часть даты мгновения:
@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 = "[email protected]:mm:ss.SSSZ", locale = "en_GB") public Date getCurrentDate() { return new Date(); }
3.4. Указание формы
Использование @JsonFormat с shape , установленным в JsonFormat.Форма.NUMBER приводит к выходу по умолчанию для типов Date — как количество секунд с момента эпохи . Параметр pattern не применим к этому случаю и игнорируется:
@JsonFormat(shape = JsonFormat.Shape.NUMBER) public Date getDateNum() { return new Date(); }
Выходные данные, как показано ниже:
{ ..., "dateNum":1482054723876 }
4. Заключение
В заключение, @JsonFormat используется для управления выходным форматом типов Дата и Календарь , как показано выше.
Приведенный выше пример кода доступен на GitHub .