java - Jackson - 无法反序列化带有时区偏移量的日期时间 'unparsed text found at index 23'

标签 java spring datetime jackson datetime-parsing

我的日期时间必须来自带有时区偏移的前端:2017-07-04T06:00:00.000+01:00

我无法使用 Jackson 对其进行反序列化。 错误是:

Text '2017-07-04T06:00:00.000+01:00' could not be parsed, unparsed text found at index 23;

我试图通过 Google 搜索所有关于日期时间(末尾带有 Z)的解决方案。

    @NotNull
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS aZ")
    private LocalDateTime time;

有什么解决办法吗?

最佳答案

pattern a is used to parse AM/PM ,它不在输入 String 中,这就是您收到解析错误的原因。

输入格式与 OffsetDateTime 匹配,可以使用相应的 built-in formatter DateTimeFormatter.ISO_OFFSET_DATE_TIME 进行解析。 ,因此您可以在反序列化器对象中使用此格式化程序并将其注册到模块中。您还必须从字段中删除 JsonFormat 注释。

ObjectMapper om = new ObjectMapper();
JavaTimeModule module = new JavaTimeModule();
LocalDateTimeDeserializer deserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
module.addDeserializer(LocalDateTime.class, deserializer);
om.registerModule(module);

这将解析输入并将其转换为LocalDateTime。在我所做的测试中,LocalDateTime 的值设置为 2017-07-04T06:00

<小时/>

要控制输出,您可以执行以下操作:

om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

这会将 LocalDateTime 输出为 2017-07-04T06:00:00,或者您可以使用自定义格式化程序:

LocalDateTimeSerializer serializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS a"));
module.addSerializer(LocalDateTime.class, serializer);

上面的序列化器会将字段输出为 2017-07-04T06:00:00.000 AM。请注意,Z 模式将不起作用,因为 LocalDateTime 没有时区信息,并且无法解析其偏移量 - 因为当您反序列化为 LocalDateTime,输入中的偏移信息(+01:00)丢失。

<小时/>

另一种选择(无需配置对象映射器)是在注释中使用正确的模式:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS[xxx]")
private LocalDateTime time;

请注意,我使用了模式 [xxx],因为偏移量 (+01:00) 可以是可选的:反序列化时,此信息会丢失,因为 LocalDateTime 没有有关时区和偏移量的信息,因此在序列化时不会找到该字段 - 使该字段可选(使用 [] 分隔符)使其适用于反序列化和序列化.

这将反序列化输入 2017-07-04T06:00:00.000+01:00 并序列化为 2017-07-04T06:00:00.000(请注意,可选偏移量在序列化中不使用,因为 LocalDateTime 没有此类信息)。

<小时/>

如果您想要不同的格式进行反序列化和序列化,您还可以创建自定义类并在字段中对其进行注释:

public class CustomDeserializer extends LocalDateTimeDeserializer {
    public CustomDeserializer() {
        super(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    }
}

public class CustomSerializer extends LocalDateTimeSerializer {
    public CustomSerializer() {
        super(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS a"));
    }
}

// in this case, don't use @JsonFormat
@JsonSerialize(using = CustomSerializer.class)
@JsonDeserialize(using = CustomDeserializer.class)
private LocalDateTime time;

这将使用格式 2017-07-04T06:00:00.000+01:00 进行反序列化,并使用格式 2017-07-04T06:00:00.000 AM序列化。

关于java - Jackson - 无法反序列化带有时区偏移量的日期时间 'unparsed text found at index 23',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44913598/

相关文章:

java - 在使用 Java 8 流的存储库上使用 Spring Data Rest(对于查找器返回类型)

java - 如何在 Spring Controller 中提供文件的动态路径

r - 将 %B.%Y 转换为 R 中的日期返回 NA

java - Android:在数组中查找匹配元素的方法?

java - 反转并比较字符串

java - 扫描仪问题

java - Guice 将对象注入(inject)到类构造函数中

java - 必须指定spring security的authenticationManager

c++ - 检测到 QT UTC linux 时钟偏差。您的构建可能不完整

python - 如何获得上周五?