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の中で混在するなど、通常の設計ではほとんどないだろうし
後者の方法を採用することが多いであろう。