自定义反序列化日期的格式

时间:2019-06-10 14:25:50

标签: java jackson

  

[“ last_modified”])]的根本原因   java.time.format.DateTimeParseException:无法解析文本'2018-06-06T13:19:53 + 00:00',未解析的文本位于索引19

入站格式为2018-06-06T13:19:53+00:00
这是一种奇怪的格式。

我尝试了以下方法:

public class XYZ {  
    @DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss+00:00", iso = ISO.DATE_TIME)
    private LocalDateTime lastModified;
}  

3 个答案:

答案 0 :(得分:1)

  

入站格式为2018-06-06T13:19:53+00:00
  这是一种奇怪的格式。

这是ISO 8601格式,得到RFC 3339xkcd 1179的认可:

xkcd 1179: ISO 8601


在将值作为查询参数接收时,以下各项应可正常工作:

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDate dateTime;

由于2018-06-06T13:19:53+00:00代表的日期和时间与UTC有所偏差,因此最好使用OffsetDateTime而不是LocalDateTime

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private OffsetDateTime dateTime;

只需确保将+编码为%2B


使用Jackson,您可以将jackson-datatype-jsr310依赖项添加到您的应用程序中。此模块将为您提供serializers类型的deserializersjava.time

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>${jackson.version}</version>
</dependency>

然后在您的JavaTimeModule中注册ObjectMapper模块:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

Jackson将为您处理序列化和反序列化。

如果由于某种原因,您对UTC的偏移量不感兴趣,并且想继续使用LocalDateTime,则可以扩展Jackson提供的LocalDateTimeDeserializer并使用自定义的DateTimeFormatter

public class CustomLocalDateTimeDeserializer extends LocalDateTimeDeserializer {

    public CustomLocalDateTimeDeserializer() {
        super(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    }
}

然后注释LocalDateTime字段,如下所示:

@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
private LocalDateTime dateTime;

答案 1 :(得分:1)

没有什么可以阻止您创建自己的解串器。以下是一个非常幼稚的示例:

public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss+00:00";

    private final DateTimeFormatter formatter;

    public LocalDateTimeDeserializer() {
        this.formatter = DateTimeFormatter.ofPattern(PATTERN);
    }

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return LocalDateTime.parse(p.getText(), formatter);
    }
}

您唯一需要注意的是,您需要通过在单引号周围加上单引号来转义“ T”。

使用解串器,您可以像这样简单地注释字段:

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime dateTime;

答案 2 :(得分:0)

  

入站格式为2018-06-06T13:19:53 + 00:00

如果您可以在整个ObjectMapper上设置日期格式,则可以执行以下操作:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
objectMapper.setDateFormat(df);

这是SimpleDateFormat Javadocs

中示例的一部分