如何使用Jackson序列化LocalDateTime?

时间:2017-01-19 18:53:49

标签: java jackson java-time

我得到了以下代码:

    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

3 个答案:

答案 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);
  }
  
}