Jackson の 日付時刻の読込み

JSR310 Date And Time API に従ったJacksonは、
jackson-datatype-jsr310 を使用する。
Maven 利用なら、pom.xml は、全部で

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.12.3</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-annotations</artifactId>
   <version>2.12.3</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-core</artifactId>
   <version>2.12.3</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.12.3</version>
</dependency>

読み込むJSON

{
   "adate": "2021/04/20",
   "atime": "2021/04/20 08:12:46"
}

アノテーションを使用する方法とデシリアライザモジュールをマッパーに登録する方法の
2つの方法がある。

アノテーションマッピング対象クラスの属性に付与する方法
対象JSONの日付時刻書式が、1つでなく複数存在するケース、
例えば、yyyy-MM-dd だったり、yyyy/MM/dd で書かれていたり混在する場合は、
対象フィールド毎に指定する方法が良い。

import java.time.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import lombok.Data;
@Data
public class Some{
   @JsonDeserialize(using=LocalDateDeserializer.class)
   @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy/MM/dd")
   private LocalDate adate;

   @JsonDeserialize(using=LocalDateTimeDeserializer.class)
   @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy/MM/dd HH:mm:ss")
   private LocalDateTime atime;
}

実行は、通常どおり。

ObjectMapper mapper = new ObjectMapper();
try{
   Some some = mapper.readValue(jsontxt, Some.class);

}catch (JsonMappingException e){
   e.printStackTrace();
}catch (JsonProcessingException e){
   e.printStackTrace();
}

デシリアライザモジュールをマッパーに登録する方法
マッピングするクラス定義では、アノテーションを付けない。

import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Data;
@Data
public class Some2{
   private LocalDate adate;
   private LocalDateTime atime;
}

ObjectMapper に、デシリアライザのモジュールを登録してから読込み実行する。

JavaTimeModule jtm = new JavaTimeModule();
jtm.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy/MM/dd")));
jtm.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));
ObjectMapper mapper = new ObjectMapper().registerModule(jtm);
try{
   Some some = mapper.readValue(jsontxt, Some2.class);
   
}catch (JsonMappingException e){
   e.printStackTrace();
}catch (JsonProcessingException e){
   e.printStackTrace();
}

日付時刻の書式が、JSONの中で混在するなど、通常の設計ではほとんどないだろうし
後者の方法を採用することが多いであろう。