Сериализация даты и времени с помощью Jackson ObjectMapper - PullRequest
0 голосов
/ 08 мая 2020

Jackson ObjectMapper сериализует как Date, так и Timestamp как Long в версии 2.9.x , тогда как Date сериализуется как Formatted String в 2.6.x и Timestamp как Long в версии ** 2.6.x * по умолчанию.

Пример:

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.6.x в 2.9.x версия.

Я пробовал 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 (даже если он работает), потому что он будет использоваться для десериализация также при другом формате даты ввода.

Есть ли способ добиться этого?

1 Ответ

1 голос
/ 08 мая 2020

Вы можете использовать такую ​​аннотацию для элемента Date:

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

EDIT:

Создайте такой класс:

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