Jackson ObjectMapper 的日期和时间戳序列化
Date and Timestamp serialization by Jackson ObjectMapper
Jackson ObjectMapper
正在将 Date
和 Timestamp
序列化为 2.9.x 版本中的 Long
而 Date 在 2.6.x 中被序列化为 Formatted String
,而 Timestamp
在 **2.6.x 中被序列化为 Long
* 默认版本。
示例:
case class Test(date: java.sql.Date, tmp: java.sql.Timestamp)
val test = Test(new java.sql.Date(1588892400000L), new Timestamp(1588892400000L))
writeValueAsString(test)
{"date":"2020-05-08","tmp":1588892400000}//Version 2.6.x
{"date":1588892400000,"tmp":1588892400000}//Version 2.9.x
But I want to maintain the behavior of 2.6.x version in 2.9.x version.
我尝试了 disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
,但随后它将 Date
和 TimeStamp
都转换为 Formatted String
(如下所示)。
{"date":"2020-05-08","tmp":"2020-05-07T23:00:00.000+0000"}
如果我设置 DateFormatter**,那么它会以相同的格式转换两者。
setDateFormat(new SimpleDateFormat("yyyy-MM-dd"))`
{"date":"2020-05-08","tmp":"2020-05-08"}
**我只是尝试了一下,但我不想设置 DateFormatter(即使它有效),因为它也会在输入日期格式不同的情况下用于反序列化。
有办法实现吗?
您可以为 Date
成员使用这样的注释:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
编辑:
像这样创建一个class:
public class CustomSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String s = sdf.format(value);
gen.writeString(s);
} catch (DateTimeParseException e) {
System.err.println(e);
gen.writeString("");
}
}
}
并像这样使用:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Date.class, new CustomSerializer());
mapper.registerModule(module);
Jackson ObjectMapper
正在将 Date
和 Timestamp
序列化为 2.9.x 版本中的 Long
而 Date 在 2.6.x 中被序列化为 Formatted String
,而 Timestamp
在 **2.6.x 中被序列化为 Long
* 默认版本。
示例:
case class Test(date: java.sql.Date, tmp: java.sql.Timestamp)
val test = Test(new java.sql.Date(1588892400000L), new Timestamp(1588892400000L))
writeValueAsString(test)
{"date":"2020-05-08","tmp":1588892400000}//Version 2.6.x
{"date":1588892400000,"tmp":1588892400000}//Version 2.9.x
But I want to maintain the behavior of 2.6.x version in 2.9.x version.
我尝试了 disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
,但随后它将 Date
和 TimeStamp
都转换为 Formatted String
(如下所示)。
{"date":"2020-05-08","tmp":"2020-05-07T23:00:00.000+0000"}
如果我设置 DateFormatter**,那么它会以相同的格式转换两者。
setDateFormat(new SimpleDateFormat("yyyy-MM-dd"))`
{"date":"2020-05-08","tmp":"2020-05-08"}
**我只是尝试了一下,但我不想设置 DateFormatter(即使它有效),因为它也会在输入日期格式不同的情况下用于反序列化。
有办法实现吗?
您可以为 Date
成员使用这样的注释:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
编辑:
像这样创建一个class:
public class CustomSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String s = sdf.format(value);
gen.writeString(s);
} catch (DateTimeParseException e) {
System.err.println(e);
gen.writeString("");
}
}
}
并像这样使用:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Date.class, new CustomSerializer());
mapper.registerModule(module);