如何在自己的自定义反序列化器中使用一些 Jackson 反序列化器?
How to use some Jackson Deserializer in own custom Deserializer?
我正在努力解决问题中提到的问题。
我需要创建一些自定义反序列化器,它或多或少是标准反序列化器的类型转换(原因是 ZonedDateTime
正在为我的输入工作,但我不想将类型更改为 ZonedDateTime
, 但保留 LocalDateTime
).
基本上我想在解串器中做的是:
- 使用
ZonedDateTime
反序列化器进行反序列化(我发现实际上是自定义 InstantDeserializer
)
- 使用
.toLocalDateTime
和return它。
我该如何使用它?
一直想找,找不到。
@JsonDeserialize 用于表示使用自定义反序列化器
public class Event {
public String name;
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime date;
}
而自定义解串器如下:
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser jsonparser, DeserializationContext context)
throws IOException, JsonProcessingException {
String date = jsonparser.getText();
JavaTimeModule javaTimeModule = new JavaTimeModule();
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(javaTimeModule);
ZonedDateTime zonedDateTime = mapper.readValue(date, ZonedDateTime.class);
return zonedDateTime.toLocalDateTime();
}
}
The demo can be accessed in github
Maven 依赖
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.8.9</version>
</dependency>
</dependencies>
如果您的输入表示 ZonedDateTime
,并且您想将其转换为 LocalDateTime
,您可以执行以下操作。
我创建了一个示例 class,其中包含 LocalDateTime
字段:
public class ZoneToLocalTest {
@JsonDeserialize(using = CustomZonedToLocalDeserializer.class)
private LocalDateTime date;
// getter and setter
}
并且还创建了反序列化器class:
public class CustomZonedToLocalDeserializer extends LocalDateTimeDeserializer {
public CustomZonedToLocalDeserializer() {
super(DateTimeFormatter.ISO_ZONED_DATE_TIME);
}
}
我已经用输入 2017-07-05T14:10:45.432+01:00[Europe/London]
进行了测试,结果是 LocalDateTime
,值为 2017-07-05T14:10:45.432
。
如果输入的格式不同,那么您需要在 CustomZonedToLocalDeserializer
class 中使用此格式(而不是使用 DateTimeFormatter.ISO_ZONED_DATE_TIME
,您可以使用 DateTimeFormatter.ofPattern(pattern)
).
我正在努力解决问题中提到的问题。
我需要创建一些自定义反序列化器,它或多或少是标准反序列化器的类型转换(原因是 ZonedDateTime
正在为我的输入工作,但我不想将类型更改为 ZonedDateTime
, 但保留 LocalDateTime
).
基本上我想在解串器中做的是:
- 使用
ZonedDateTime
反序列化器进行反序列化(我发现实际上是自定义InstantDeserializer
) - 使用
.toLocalDateTime
和return它。
我该如何使用它? 一直想找,找不到。
@JsonDeserialize 用于表示使用自定义反序列化器
public class Event {
public String name;
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime date;
}
而自定义解串器如下:
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser jsonparser, DeserializationContext context)
throws IOException, JsonProcessingException {
String date = jsonparser.getText();
JavaTimeModule javaTimeModule = new JavaTimeModule();
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(javaTimeModule);
ZonedDateTime zonedDateTime = mapper.readValue(date, ZonedDateTime.class);
return zonedDateTime.toLocalDateTime();
}
}
The demo can be accessed in github
Maven 依赖
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.8.9</version>
</dependency>
</dependencies>
如果您的输入表示 ZonedDateTime
,并且您想将其转换为 LocalDateTime
,您可以执行以下操作。
我创建了一个示例 class,其中包含 LocalDateTime
字段:
public class ZoneToLocalTest {
@JsonDeserialize(using = CustomZonedToLocalDeserializer.class)
private LocalDateTime date;
// getter and setter
}
并且还创建了反序列化器class:
public class CustomZonedToLocalDeserializer extends LocalDateTimeDeserializer {
public CustomZonedToLocalDeserializer() {
super(DateTimeFormatter.ISO_ZONED_DATE_TIME);
}
}
我已经用输入 2017-07-05T14:10:45.432+01:00[Europe/London]
进行了测试,结果是 LocalDateTime
,值为 2017-07-05T14:10:45.432
。
如果输入的格式不同,那么您需要在 CustomZonedToLocalDeserializer
class 中使用此格式(而不是使用 DateTimeFormatter.ISO_ZONED_DATE_TIME
,您可以使用 DateTimeFormatter.ofPattern(pattern)
).