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

Руководство по @JsonFormat в Джексоне

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

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 .