我正在努力解决问题中提到的问题。
我需要创建一些自定义反序列化器,它或多或少是标准反序列化器的类型转换(原因是ZonedDateTime
适用于我的输入,但我不想将类型更改为{ {1}},但请保留ZonedDateTime
)。
基本上我想在我的解串器中做的是:
LocalDateTime
反序列化器进行反序列化(我发现,实际上是自定义ZonedDateTime
)InstantDeserializer
并将其返回。我该如何使用它? 试图找到它,但我不能。
答案 0 :(得分:2)
@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>
答案 1 :(得分:1)
如果您的输入代表ZonedDateTime
,并且您想将其转换为LocalDateTime
,则可以执行以下操作。
我创建了一个带有LocalDateTime
字段的示例类:
public class ZoneToLocalTest {
@JsonDeserialize(using = CustomZonedToLocalDeserializer.class)
private LocalDateTime date;
// getter and setter
}
还创建了反序列化器类:
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
类中使用此格式(而不是使用DateTimeFormatter.ISO_ZONED_DATE_TIME
,而是使用DateTimeFormatter.ofPattern(pattern)
)。