我得到了以下代码:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
String now = new ObjectMapper().writeValueAsString(new SomeClass(LocalDateTime.now()));
System.out.println(now);
我明白了:
{"时间" {"小时":20,"分钟":49,"第二":42,&#34 ;纳米":99000000," DAYOFYEAR":19,"一周中的某天":"周四""一个月":" JANUARY""请将dayOfMonth":19,"一年":2017," monthValue":1,"年表" {&# 34; ID":" ISO"" calendarType":" ISO8601"}}}
我想要达到的是ISO8601中的字符串
2017-01-19T18:36:51Z
答案 0 :(得分:18)
这可能是由于代码中的错误造成的。您正在使用新的未配置的mapper实例,这是修复:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
String now = mapper.writeValueAsString(new SomeClass(LocalDateTime.now()));
System.out.println(now);
答案 1 :(得分:3)
这是您可以为OffsetDateTime
执行的操作:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "uuuu-MM-dd'T'HH:mm:ss.SSSXXXX")
private OffsetDateTime timeOfBirth;
对于LocalDateTime,您不能使用XXXX(区域偏移),因为没有偏移信息。所以你可以放弃它。但是ISO8601 discourages using Local Time因为它含糊不清:
如果没有给出时间表示的UTC关系信息, 假设时间是在当地时间。虽然它可能是安全的 假设在同一时区进行通信时的本地时间 用于跨不同时区进行通信时不明确。甚至 在一个地理时区内,一些当地时间将是 如果该地区遵守夏令时,则含糊不清。通常是这样的 最好指示时区(区域指示符)使用 标准的表示法。
答案 2 :(得分:0)
我使用 SimpleModule
,对我来说最好的做法是拥有自己的序列化和反序列化注册实现:
final SimpleModule localDateTimeSerialization = new SimpleModule();
localDateTimeSerialization.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
localDateTimeSerialization.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
objectMapper.registerModule(localDateTimeSerialization);
序列化器:
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
private final DateTimeFormatter format = DateTimeFormatter.ISO_DATE_TIME;
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.format(format));
}
}
和反序列化:
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
private final DateTimeFormatter fmt = DateTimeFormatter.ISO_DATE_TIME;
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext context) throws IOException {
return LocalDateTime.parse(p.getValueAsString(), fmt);
}
}