Jackson でJSONで表現されたエポックミリ秒またはエポック秒数を、
デシリアライズするには、次のカスタマイズ デシリアライザを用意して、
jackson-datatype-jsr310 の JavaTimeModule に登録して、
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())); } }