エポックミリ秒または秒数をJSONデシリアライズ

Jackson でJSONで表現されたエポックミリ秒またはエポック秒数を、
シリアライズするには、次のカスタマイズ デシリアライザを用意して、
jackson-datatype-jsr310JavaTimeModule に登録して、
ObjectMapper にセットする。

LocalDateTime として読込ませるためのデシリアライザ

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
/**
 * EpochDatetimeDeserializer
 */
public class EpochDatetimeDeserializer extends JsonDeserializer<LocalDateTime>{
   @Override
   public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException{
      if (!p.currentToken().isNumeric()){
         throw new JsonProcessingException(p.currentName() + " is not Numeric"){};
      }
      long n = p.getValueAsLong();
      if (n < 1000000000000L) n = n * 1000;
      return Instant.ofEpochMilli(n).atZone(ZoneId.systemDefault()).toLocalDateTime();
   }
}

java.sql.Timestamp として読込ませるためのデシリアライザ

import java.io.IOException;
import java.sql.Timestamp;
import java.time.Instant;
import java.time.ZoneId;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
/**
 * EpochSqlTimestampDeserializer
 */
public class EpochSqlTimestampDeserializer extends JsonDeserializer<Timestamp>{
   @Override
   public Timestamp deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException{
      if (!p.currentToken().isNumeric()) {
         throw new JsonProcessingException(p.currentName() + " is not Numeric"){};
      }
      long n = p.getValueAsLong();
      if (n < 1000000000000L) n = n * 1000;
      return Timestamp.valueOf(Instant.ofEpochMilli(n).atZone(ZoneId.systemDefault()).toLocalDateTime());
   }
}

サンプルのJSON

{
   "atime": 1621679723354,
   "btime": 1621679723354
}

サンプルのクラス

import java.sql.Timestamp;
import java.time.LocalDateTime;
import lombok.Data;
/**
 * Sample
 */
@Data
public class Sample{
     private LocalDateTime atime;
     private Timestamp btime;
}

実行サンプル

JavaTimeModule jtm = new JavaTimeModule();
jtm.addDeserializer(LocalDateTime.class, new EpochDatetimeDeserializer())
.addDeserializer(Timestamp.class, new EpochSqlTimestampDeserializer());

ObjectMapper mapper = new ObjectMapper().registerModule(jtm);
try(InputStream in = new FileInputStream(new File("test.json"))){
    Sample sample = mapper.readValue(in, Sample.class);

}catch (IOException e){
   e.printStackTrace();
}finally{
}

java.sql.Timestamp は、DateTimeFormatter でのデシリアライズシリアライズは、
以下のようなのを用意する必要がある。

import java.io.IOException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
/**
 * SqlTimestampDeSerializer
 */
public class SqlTimestampDeSerializer extends JsonDeserializer<Timestamp>{
   private DateTimeFormatter formatter;

   public SqlTimestampDeSerializer(DateTimeFormatter formatter){
       this.formatter = formatter;
   }
   @Override
   public Timestamp deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException{
      return Timestamp.valueOf(LocalDateTime.parse(p.getText(), formatter));
   }
}
import java.io.IOException;
import java.sql.Timestamp;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
/**
 * SqlTimestampSerializer
 */
public class SqlTimestampSerializer extends StdSerializer<Timestamp>{
   private DateTimeFormatter formatter;

   public SqlTimestampSerializer(DateTimeFormatter formatter) {
      super(Timestamp.class);
      this.formatter = formatter;
   }
   @Override
   public void serialize(Timestamp value, JsonGenerator gen, SerializerProvider provider) throws IOException{
      gen.writeString(formatter.format(value.toLocalDateTime()));
   }
}