Преобразование формата даты в JSON с использованием Jackson
Быстрый ответ
Для управления сериализацией полей типа Date
в Jackson, вы можете установить необходимый формат даты в JSON. Для этого служит аннотация @JsonFormat
с атрибутом pattern
в вашей модели данных.
Пример:
public class Event {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date eventDate;
// геттеры и сеттеры
}
С применением данного приёма Jackson отформатирует даты в JSON-выводе в формате "yyyy-MM-dd HH:mm:ss".
[AsideBanner]
Специфика работы с часовыми поясами
Желаемый часовой пояс можно задать, используя атрибут timezone
:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "EST")
private Date eventTime;
Пользовательская сериализация/десериализация
Для более сложного форматирования дат можно воспользоваться собственными сериализаторами и десериализаторами. С их помощью вы полностью контролируете обработку дат.
public class CustomDateSerializer extends StdSerializer<Date> {
private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm a z");
public CustomDateSerializer() {
this(null);
}
public CustomDateSerializer(Class<Date> t) {
super(t);
}
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2) throws IOException {
gen.writeString(formatter.format(value));
}
}
Совет: Связать сериализатор с полем можно с помощью аннотации @JsonSerialize
:
@JsonSerialize(using = CustomDateSerializer.class)
private Date eventDate;
Экспертный совет: Соответствующий JsonDeserializer
будет полезен при десериализации:
public class CustomDateDeserializer extends StdDeserializer<Date> {
public CustomDateDeserializer() {
this(null);
}
public CustomDateDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException {
String date = jsonParser.getText();
try {
return new SimpleDateFormat("yyyy-MM-dd HH:mm a z").parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
Для активации десериализатора используйте @JsonDeserialize
:
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date eventDate;
Глобальный формат даты: единообразие и последовательность
Единый формат дат можно задать глобально с использованием ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
mapper.setDateFormat(sdf);
Теперь этот формат станет стандартом для всех операций сериализации и десериализации типа Date
.
Визуализация
Представим пользовательское форматирование дат с Jackson как путешествие во времени:
🕒 Путешествие Во Времени 🕒
| Настоящее (Входные данные) | Машина Времени (Аннотация) | Будущее (Вывод JSON) |
| --------------------------- | ------------------------------------ | --------------------- |
| 2023-04-12T08:30 | @JsonFormat(pattern="dd/MM/yyyy HH:mm:ss") | "12/04/2023 08:30:00" |
Настройки Машины Времени (аннотация) действуют как флюкс-конденсатор
, помогая преобразовать настоящее в будущее.
В Java:
@JsonFormat(pattern="dd/MM/yyyy HH:mm:ss")
private Date startTime;
В JSON:
{ "startTime": "12/04/2023 08:30:00" }
Используя Jackson, вы становитесь не просто разработчиком, а повелителем времени
!
Полезные материалы
- Полное руководство по аннотации @JsonFormat в Jackson – подробный обзор возможностей Jackson с применением
@JsonFormat
. - Создание пользовательских сериализаторов в Jackson – детальное руководство, как стать
магом дат
, с применением пользовательской сериализации. - Работаем с датами в Jackson ObjectMapper – основные концепции работы с датами в
ObjectMapper
. - Аннотации Jackson для форматирования даты и времени – описание всех аннотаций, применяемых для форматирования даты и времени в Jackson.
- Форматирование JSON-дат в Spring Boot с помощью Jackson – интеграция Jackson в Spring Boot для форматирования дат.
- Обсуждение формата дат Jackson на Stack Overflow – обмен опытом, примеры и решения по теме.