【问题标题】:How to serialize LocalDateTime with Jackson?如何用杰克逊序列化 LocalDateTime?
【发布时间】:2017-06-04 14:37:37
【问题描述】:

我得到以下代码:

    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);

我明白了:

{"time":{"hour":20,"minute":49,"second":42,"nano":99000000,"dayOfYear":19,"dayOfWeek":"THURSDAY","month" :"JANUARY","dayOfMonth":19,"year":2017,"monthValue":1,"chronology":{"id":"ISO","calendarType":"iso8601"}}}

我想要实现的是ISO8601中的字符串

2017-01-19T18:36:51Z

【问题讨论】:

  • 会不会有这样的工作:DateFormat df = new SimpleDateFormat("MM/dd/yy hh:mm a");然后:mapper.setDateFormat(df);

标签: java jackson java-time


【解决方案1】:

这可能是由于您的代码中的错误。您正在使用新的未配置的映射器实例,这是修复:

 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);

【讨论】:

    【解决方案2】:

    这就是你可以为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 关系信息, 时间假定为当地时间。虽然它可能是安全的 在同一时区进行通信时假设本地时间,它是 用于跨时区通信时模棱两可。甚至 在一个地理时区内,一些当地时间将是 如果该地区遵守夏令时,则不明确。通常是 最好用 标准符号。

    【讨论】:

      【解决方案3】:

      我使用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);
        }
        
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-18
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多