我的日期时间必须来自前端,具有时区偏移量:2017-07-04t06:000.000+01:00
我不能把它和杰克逊反序列化。错误是:
@NotNull
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS aZ")
private LocalDateTime time;
模式a
用于解析AM/PM,它不在输入字符串
中,这就是为什么会出现解析错误。
输入格式匹配offsetdatetime
,可以用相应的内置格式化程序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
,也可以使用自定义格式化程序:
LocalDateTimeSerializer serializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS a"));
module.addSerializer(LocalDateTime.class, serializer);
上面的序列化程序将输出字段为2017-07-04t06:000.000am
。请注意,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.000+01:00
并序列化为2017-07-04t06:00.000
(注意,序列化中不使用可选偏移量,因为LocalDateTime
没有此类信息)。
如果需要不同的反序列化和序列化格式,还可以创建自定义类并在字段中对它们进行Anotation:
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.000+01:00
进行反序列化,并使用格式2017-07-04T06:00.000
进行序列化。
我得到:类型的ISO
输入文本为2020年2月20日 以下代码块抛出,其中包含无法分析的消息文本“28Feb2020”,在索引7中找到未分析的文本:
我正在开发新闻应用程序,我已经将从现在到那个日期的运行时间进行了转换,但当我运行代码时,我的适配器类中出现了以下异常 JAVA时间总体安排DateTimeParseException:无法在索引0处分析文本“09/10/2019”,无法在索引19处找到未分析的文本 低于我的适配器类 以下是JSON响应:
下面是我的字符串:convertdate:'2016-08-18 14:27:15.103+02' 和我的代码: 我想不是太复杂,买我看不出错误。字符串中的+02可能是原因吗?
问题:假客户机对返回的Spring boot Rest API进行API调用时,无法反序列化该页的属性。 Spring Boot:2.3.3.发布 春云假:2.2.5.发布 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造的实例(没有像默认构造函数一样的创建者存在):无法从[源:(BufferedReader);行
我有一个Pojo对象,由Jersey使用jackson序列化: 序列化产生了一个像这样的Json: 但是,当我尝试像这样反序列化来自客户端的消息时: 我得到以下错误: 无法识别的字段“键”(类com.example.server.api.书摘),未标记为可忽略 我不知道问题是来自服务器生成的JSOn还是来自客户端的反序列化。 您知道问题是什么以及如何纠正吗? 非常谢谢。