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

1. Обзор

В этой статье мы попытаемся понять, как использовать @ JsonFormat в Джексоне. Это аннотация Джексона, которая используется для указания того, как форматировать поля и/или свойства для вывода в формате JSON. В частности, эта аннотация позволяет указать, как форматировать

В частности, эта аннотация позволяет указать, как форматировать значения Date и Calendar в соответствии с форматом SimpleDateFormat .

2. Maven Dependency

@ JsonFormat определяется в https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.fasterxml.jackson.core%22%20AND%20a%3A%22jackson-databind% 22[jackson-databind], поэтому нам нужна следующая зависимость Maven:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.4</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 было аннотировано, как показано, чтобы указать формат даты.

Формат данных, используемый для аргумента pattern , указывается в SimpleDateFormat

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "[email protected]:mm:ss.SSSZ")
private Date createdDate;

С этим изменением мы строим проект снова и запускаем его. Результат показан ниже:

{"firstName":"John","lastName":"Smith","createdDate":"[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.Shape.NUMBER , приводит к выводу по умолчанию для типов Date - в качестве количества секунд с начала эпохи _. Параметр pattern_ не применим к этому случаю и игнорируется:

@JsonFormat(shape = JsonFormat.Shape.NUMBER)
public Date getDateNum() {
    return new Date();
}

Вывод как показано ниже:

{ ..., "dateNum":1482054723876 }

4. Заключение

В заключение, @ JsonFormat используется для управления форматом вывода типов Date и Calendar , как показано выше.

Пример кода, показанный выше, доступен на GitHub over .