1概要

このチュートリアルでは、Jacksonで日付をシリアル化します。単純なjava.util.

Date

、次にJoda-Time、そしてJava 8

DateTime

をシリアライズすることから始めます。


2

日付

をタイムスタンプにシリアル化

まずは、簡単な


java.util.Date

をJackson

でシリアル化する方法を見てみましょう。

次の例では、

Date

フィールドが ”

eventDate

“の ”

Event

“のインスタンスをシリアル化します。

@Test
public void whenSerializingDateWithJackson__thenSerializedToTimestamp()
  throws JsonProcessingException, ParseException {

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm");
    df.setTimeZone(TimeZone.getTimeZone("UTC"));

    Date date = df.parse("01-01-1970 01:00");
    Event event = new Event("party", date);

    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValueAsString(event);
}

ここで重要なのは、JacksonがデフォルトでDateをタイムスタンプ形式にシリアル化することです(1970年1月1日、UTC以降のミリ秒数)。



event

”シリアライゼーションの実際の出力は次のとおりです。

{
   "name":"party",
   "eventDate":3600000
}


3

Date

をISO-8601

にシリアライズする

この簡潔なタイムスタンプ形式にシリアル化することは最適ではありません。

Date



ISO-8601

形式にシリアル化しましょう。

@Test
public void whenSerializingDateToISO8601__thenSerializedToText()
  throws JsonProcessingException, ParseException {

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm");
    df.setTimeZone(TimeZone.getTimeZone("UTC"));

    String toParse = "01-01-1970 02:30";
    Date date = df.parse(toParse);
    Event event = new Event("party", date);

    ObjectMapper mapper = new ObjectMapper();
    mapper.disable(SerializationFeature.WRITE__DATES__AS__TIMESTAMPS);
   //StdDateFormat is ISO8601 since jackson 2.9
    mapper.setDateFormat(new StdDateFormat().withColonInTimeZone(true));
    String result = mapper.writeValueAsString(event);
    assertThat(result, containsString("1970-01-01T02:30:00.000+00:00"));
}

日付の表現がはるかに読みやすくなっていることに注意してください。


4

ObjectMapper


DateFormat


を設定します.

以前のソリューションでは、

java.util.Date

インスタンスを表すための正確な形式を選択するという柔軟性がまだ十分にありません。

それでは、日付を表現するためのフォーマットを設定するための設定を見てみましょう。

@Test
public void whenSettingObjectMapperDateFormat__thenCorrect()
  throws JsonProcessingException, ParseException {

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm");

    String toParse = "20-12-2014 02:30";
    Date date = df.parse(toParse);
    Event event = new Event("party", date);

    ObjectMapper mapper = new ObjectMapper();
    mapper.setDateFormat(df);

    String result = mapper.writeValueAsString(event);
    assertThat(result, containsString(toParse));
}

日付フォーマットに関しては現在より柔軟になっていますが、

ObjectMapper

全体のレベルではまだグローバル設定を使用しています。


5

Date


をフォーマットするには

@ JsonFormat

を使用してください.

次に、アプリケーション全体について、グローバルではなく** 個々のクラスの日付書式を制御するための

@ JsonFormat

アノテーションを見てみましょう。

public class Event {
    public String name;

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

それでは、テストしましょう。

@Test
public void whenUsingJsonFormatAnnotationToFormatDate__thenCorrect()
  throws JsonProcessingException, ParseException {

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
    df.setTimeZone(TimeZone.getTimeZone("UTC"));

    String toParse = "20-12-2014 02:30:00";
    Date date = df.parse(toParse);
    Event event = new Event("party", date);

    ObjectMapper mapper = new ObjectMapper();
    String result = mapper.writeValueAsString(event);
    assertThat(result, containsString(toParse));
}


6. カスタム日付シリアライザ

次に、出力を完全に制御するために、Datesにカスタムシリアライザを使用します。

public class CustomDateSerializer extends StdSerializer<Date> {

    private SimpleDateFormat formatter
      = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");

    public CustomDateSerializer() {
        this(null);
    }

    public CustomDateSerializer(Class t) {
        super(t);
    }

    @Override
    public void serialize (Date value, JsonGenerator gen, SerializerProvider arg2)
      throws IOException, JsonProcessingException {
        gen.writeString(formatter.format(value));
    }
}

次に、これを「

eventDate

」フィールドのシリアライザとして使用しましょう。

public class Event {
    public String name;

    @JsonSerialize(using = CustomDateSerializer.class)
    public Date eventDate;
}

最後に、テストしましょう。

@Test
public void whenUsingCustomDateSerializer__thenCorrect()
  throws JsonProcessingException, ParseException {

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");

    String toParse = "20-12-2014 02:30:00";
    Date date = df.parse(toParse);
    Event event = new Event("party", date);

    ObjectMapper mapper = new ObjectMapper();
    String result = mapper.writeValueAsString(event);
    assertThat(result, containsString(toParse));
}