--- aliases: tags: - maturity/🌱 date: 2023-11-20 zero-link: - "[[../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" parents: linked: article: https://note.struchkov.dev/localdatetime-deserializer/ --- Чаще всего по работе я сталкиваюсь с проблемой десериализации и сериализации даты. Многие разработчики отступают от стандартного формата времени `yyyy-MM-dd'T'HH:mm:ss*SSSZZZZ` и изобретают свои форматы. К сожалению, в Jackson не заложены все возможные форматы даты, поэтому необходимо написать свой десериализатор. ## Десериализация В данном случае это преобразование json формата в Java объект. Необходимо расширить абстрактный класс `StdDeserializer`. ```java import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class CustomDeserializer extends StdDeserializer { protected CustomDeserializer() { this(null); } protected CustomDeserializer(Class vc) { super(vc); } @Override public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException { String value = jsonParser.getText(); if (!"".equals(value)) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); return LocalDateTime.parse(value, formatter); } return null; } } ``` После этого необходимо над полем поставить аннотацию `@JsonDeserialize` c указанием нашего кастомного десериализатора. ```java public class Foo { // ... ... ... ... ... @JsonDeserialize(using = CustomDeserializer.class) private LocalDateTime date; // ... ... ... ... ... } ``` ## Сериализация В данном случае это преобразование Java объекта в json формат. Для сериализации необходимо расширить класс `StdSerializer`. ```java import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class CustomSerializer extends StdSerializer { protected CustomSerializer(Class t) { super(t); } protected CustomSerializer() { this(null); } @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); gen.writeString(formatter.format(value)); } } ``` Для работы над полем поставить аннотацию `@JsonSerialize` ```java public class Foo { // ... ... ... ... ... @JsonSerialize(using = LocalDateTimestampSerializer.class) private LocalDateTime date; // ... ... ... ... ... } ```