OffsetDateTime反序列化时毫秒位末尾0被截断的问题求助
解决Jackson反序列化OffsetDateTime时毫秒位末尾0被截断的问题
要让OffsetDateTime序列化后保留完整三位毫秒(比如2023-06-20T06:59:31.400Z而不是2023-06-20T06:59:31.4Z),需要调整Jackson的日期格式化配置,具体操作如下:
- 替换过时的
JSR310Module为JavaTimeModule,这是Jackson 2.8+版本推荐用于处理Java 8日期时间API的模块。 - 为
OffsetDateTime指定固定格式化模式"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",强制保留三位毫秒位。 - 禁用
DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE,避免时区自动调整导致格式异常。
完整的ObjectMapper配置代码如下:
ObjectMapper jsonMapper = new ObjectMapper(); // 保留原有配置 jsonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); jsonMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); jsonMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false); // 配置JavaTimeModule并绑定格式化器 JavaTimeModule timeModule = new JavaTimeModule(); DateTimeFormatter offsetDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); timeModule.addSerializer(OffsetDateTime.class, new OffsetDateTimeSerializer(offsetDateTimeFormatter)); timeModule.addDeserializer(OffsetDateTime.class, new OffsetDateTimeDeserializer(offsetDateTimeFormatter)); jsonMapper.registerModule(timeModule); // 禁用时区自动调整,保证序列化结果时区与原数据一致 jsonMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
关键说明
- 通过
OffsetDateTimeSerializer和OffsetDateTimeDeserializer绑定指定格式,强制输出三位毫秒,即使末尾为0也不会被截断。 JavaTimeModule是JSR310Module的替代方案,功能更完善且处于活跃维护状态,建议优先使用。
内容的提问来源于stack exchange,提问作者mathew thomas
相关产品推荐
相关产品推荐

