2024-09-04 20:02:42 +03:00
---
aliases:
tags:
- maturity/🌱
2024-09-08 00:56:18 +03:00
date: 2023-11-20
2024-09-04 20:02:42 +03:00
zero-link:
- "[[../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
2024-09-14 22:02:28 +03:00
parents:
- "[[../../../../knowledge/dev/java/other/Jackson|Jackson]]"
linked:
2024-09-04 20:02:42 +03:00
---
2024-09-17 21:10:50 +03:00
Чаще всего по работе я сталкиваюсь с проблемой десериализации и сериализации даты. Многие разработчики отступают от стандартного формата времени `yyyy-MM-dd'T'HH:mm:ss*SSSZZZZ` и изобретают свои форматы.
2024-09-04 20:02:42 +03:00
К сожалению, в Jackson не заложены все возможные форматы даты, поэтому необходимо написать свой десериализатор.
## Десериализация
2024-09-17 21:10:50 +03:00
В данном случае это преобразование json формата в Java объект. Необходимо расширить абстрактный класс `StdDeserializer` .
2024-09-04 20:02:42 +03:00
```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< LocalDateTime > {
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;
}
}
```
2024-09-17 21:10:50 +03:00
После этого необходимо над полем поставить аннотацию `@JsonDeserialize` c указанием нашего кастомного десериализатора.
2024-09-04 20:02:42 +03:00
```java
public class Foo {
// ... ... ... ... ...
@JsonDeserialize (using = CustomDeserializer.class)
private LocalDateTime date;
// ... ... ... ... ...
}
```
## Сериализация
2024-09-17 21:10:50 +03:00
В данном случае это преобразование Java объекта в json формат. Для сериализации необходимо расширить класс `StdSerializer` .
2024-09-04 20:02:42 +03:00
```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< LocalDateTime > {
protected CustomSerializer(Class< LocalDateTime > 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));
}
}
```
2024-09-17 21:10:50 +03:00
Для работы над полем поставить аннотацию `@JsonSerialize`
2024-09-04 20:02:42 +03:00
```java
public class Foo {
// ... ... ... ... ...
@JsonSerialize (using = LocalDateTimestampSerializer.class)
private LocalDateTime date;
// ... ... ... ... ...
}
2024-09-09 21:07:47 +03:00
```
***
## Мета информация
**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]
2024-09-14 22:02:28 +03:00
**Родитель**:: [[../../../../knowledge/dev/java/other/Jackson|Jackson]]
2024-09-09 21:07:47 +03:00
**Источник**::
**Автор**::
**Создана**:: [[2023-11-20]]
### Дополнительные материалы
-
### Дочерние заметки
2024-09-14 23:38:42 +03:00
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->