首页 > 解决方案 > Jackson ObjectMapper 的日期和时间戳序列化

问题描述

Jackson在2.9.x版本中都序列化,而 DateObjectMapper默认DateTimestamp2.6.x和** 2.6.x * 版本中序列化。LongFormatted StringTimestampLong

例子:

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

但我想在2.9.x版本中保持2.6.x版本的行为。

我尝试过disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS),但随后将Date&都转换TimeStampFormatted 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(即使它有效),因为它也将用于输入日期格式不同的反序列化。

有没有办法做到这一点?

标签: javascalaserializationjacksonfasterxml

解决方案


您可以为Date成员使用这样的注释:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")

编辑:

像这样创建一个类:

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

推荐阅读