Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Jackson序列化LocalDateTime?_Java_Jackson_Java Time - Fatal编程技术网

Java 如何使用Jackson序列化LocalDateTime?

Java 如何使用Jackson序列化LocalDateTime?,java,jackson,java-time,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(LocalDat

我得到了以下代码:

    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”,“日历类型”:“iso8601”}

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

2017-01-19T18:36:51Z


这可能是由于代码中的错误。您使用的是新的未配置的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);

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

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "uuuu-MM-dd'T'HH:mm:ss.SSSXXXX")
private OffsetDateTime timeOfBirth;
对于LocalDateTime,您不能使用XXXX(区域偏移量),因为没有偏移量信息。所以你可以放下它。但由于它的模糊性:

如果没有时间表示形式的UTC关系信息, 时间假定为当地时间。虽然这样做可能是安全的 假设在同一时区通信时为本地时间,则为 在跨不同时区的通信中使用时不明确。即使 在一个地理时区内,一些当地时间将是 如果该地区遵守夏令时,则不明确。通常是 最好使用 标准符号


我使用的是
SimpleModule
,对我来说,最好的做法是拥有自己的注册实现来进行序列化和反序列化:

final SimpleModule localDateTimeSerialization = new SimpleModule();
    localDateTimeSerialization.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
    localDateTimeSerialization.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());

objectMapper.registerModule(localDateTimeSerialization);
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);
  }
  
}
序列化程序:

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));
  }
  
}
公共类LocalDateTimeSerializer扩展了JsonSerializer{
私有最终日期时间格式=DateTimeFormatter.ISO_DATE_TIME;
@凌驾
public void serialize(LocalDateTime值、JsonGenerator gen、SerializerProvider序列化程序)引发IOException{
gen.writeString(value.format(format));
}
}
和反序列化:

final SimpleModule localDateTimeSerialization = new SimpleModule();
    localDateTimeSerialization.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
    localDateTimeSerialization.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());

objectMapper.registerModule(localDateTimeSerialization);
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);
  }
  
}
公共类LocalDateTimeDeserializer扩展JsonDeserializer{
私有最终日期TimeFormatter fmt=DateTimeFormatter.ISO_DATE_TIME;
@凌驾
公共LocalDateTime反序列化(JsonParser p,反序列化上下文)引发IOException{
返回LocalDateTime.parse(p.getValueAsString(),fmt);
}
}

是否需要这样的工作:DateFormat df=new SimpleDateFormat(“MM/dd/yy hh:MM a”);然后:mapper.setDateFormat(df);