当前位置: 首页 > 知识库问答 >
问题:

如何使用Jackson序列化LocalDateTime?

於宾白
2023-03-14

我得到了以下代码

    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,"纳米": 99000000,"一天": 19,"一天":"星期四","月":"一月","一天": 19,"年": 2017,"月值": 1,"年表":{"id":"ISO","calendarType":"iso8601"}}}

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

2017-01-19T18:36:51Z

共有3个答案

邵奇
2023-03-14

我使用的是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);
  }
  
}
梁丘德寿
2023-03-14

这就是您可以为OffsetDateTime执行的操作:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "uuuu-MM-dd'T'HH:mm:ss.SSSXXXX")
private OffsetDateTime timeOfBirth;

对于LocalDateTime,您不能使用XXXX(区域偏移量),因为没有偏移量信息。所以你可以放下它。但ISO8601不鼓励使用当地时间,因为它不明确:

如果没有给出具有时间表示的UTC关系信息,则假定时间为本地时间。虽然在同一时区通信时假设本地时间可能是安全的,但在跨不同时区通信时使用本地时间是模糊的。即使在一个地理时区内,如果该地区遵守夏令时,一些当地时间也会模糊不清。通常最好使用标准的符号来指示时区(区域代号)。

仰英发
2023-03-14

这可能是由于代码中的错误。您使用的是新的未配置的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);
 类似资料:
  • 我想用Jackson 2.13.1反序列化一个枚举。 我找到了以下解决方案。 仍将收到以下错误:

  • 来自REST服务的json对象 使用JacksonInFiveMinutes中的代码 ObjectMapper mapper=new ObjectMapper(); Map userData=mapper.read值(webResource.queryParams(queryParams). get(String.class);, Map.class); 在哪里: 从REST服务返回json 从J

  • 我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。

  • 问题内容: 如何将作为地图的属性序列化为地图的值列表?我已经能够使用吸气剂上的注释进行其他简单的转换。但是,我不确定我想做什么。 问题答案: 我们需要类似的东西,在我们的案例中,我们使用了您所评论的自定义项,这很简单: 使用它的代码:

  • 问题内容: 我从ExtJS获取日期字符串,其格式为: “ 2011-04-08T09:00:00” 当我尝试反序列化此日期时,它将时区更改为“印度标准时间”(该时间增加+5:30)。这就是我反序列化日期的方式: 这样做也不会更改时区。我仍然在IST中得到日期: 如何以无时区麻烦的日期反序列化日期? 问题答案: 我找到了解决方法,但与此同时,我需要在整个项目中注释每个日期的设置器。有没有一种方法可以

  • 我有一个类,它可以很好地序列化和反序列化: 我还有一个< code>PacketResponse对象,类似于: 对象的序列化工作正常,结果如下: 然而,当我试图将这个JSON反序列化回一个< code>PacketResponse对象时,使用 我得到一个。 似乎它正在尝试反序列化 ,但由于它没有直接执行此操作,杰克逊看不到 注释,而是正在寻找 字段(因为这是构建器方法的名称)。 有人能帮我找出反序