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