1. 概要

この記事では、Jacksonで@JsonFormatを使用する方法を理解しようとしています。 これは、JSON出力のフィールドやプロパティのフォーマット方法を指定するために使用されるJacksonアノテーションです。

具体的には、このアノテーションを使用すると、DateおよびCalendarの値をSimpleDateFormat形式に従ってフォーマットする方法を指定できます。

2. Mavenの依存関係

@JsonFormatjackson-databindパッケージで定義されているため、次のMaven依存関係が必要です。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

3. 入門

3.1. デフォルト形式の使用

はじめに、ユーザーを表すクラスで@JsonFormatアノテーションを使用する概念を示します。

アノテーションの詳細を説明しようとしているため、 User オブジェクトはリクエストに応じて作成され(データベースに保存またはロードされません)、JSONにシリアル化されます。

public class User {
    private String firstName;
    private String lastName;
    private Date createdDate = new Date();

    // standard constructor, setters and getters
}

このコード例をビルドして実行すると、次の出力が返されます。

{"firstName":"John","lastName":"Smith","createdDate":1482047026009}

ご覧のとおり、 createdDate フィールドは、Dateフィールドに使用されるデフォルトの形式であるエポックからの秒数として表示されます。

3.2. ゲッターでの注釈の使用

ここで、 @JsonFormat を使用して、createdDateフィールドをシリアル化する形式を指定します。 この変更のために更新されたUserクラスは次のとおりです。 createdDate フィールドには、日付形式を指定するために示されているように注釈が付けられています。

pattern 引数に使用されるデータ形式は、SimpleDateFormatで指定されます。

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ")
private Date createdDate;

この変更を行ったら、プロジェクトを再度ビルドして実行します。 出力を以下に示します。

{"firstName":"John","lastName":"Smith","createdDate":"2016-12-18@07:53:34.740+0000"}

ご覧のとおり、 createdDate フィールドは、@JsonFormatアノテーションを使用して指定されたSimpleDateFormat形式を使用してフォーマットされています。

上記の例は、フィールドで注釈を使用する方法を示しています。 また、次のようにゲッターメソッド(プロパティ)で使用することもできます。

たとえば、呼び出し時に計算されているプロパティがある場合があります。 このような場合は、getterメソッドのアノテーションを使用できます。 インスタントの日付部分のみを返すようにパターンも変更されていることに注意してください。

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public Date getCurrentDate() {
    return new Date();
}

結果の出力は次のとおりです。

{ ... , "currentDate":"2016-12-18", ...}

3.3. ロケールの指定

日付形式の指定に加えて、シリアル化に使用するロケールを指定することもできます。 このパラメーターを指定しないと、デフォルトのロケールでシリアル化が実行されます。

@JsonFormat(
  shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ", locale = "en_GB")
public Date getCurrentDate() {
    return new Date();
}

3.4. 形状の指定

@JsonFormatshapeJsonFormat.Shape.NUMBERに設定して使用すると、Dateタイプのデフォルト出力が秒数として表示されます。エポック以降、パラメーター pattern はこの場合には適用されず、無視されます。

@JsonFormat(shape = JsonFormat.Shape.NUMBER)
public Date getDateNum() {
    return new Date();
}

出力は次のとおりです。

{ ..., "dateNum":1482054723876 }

4. 結論

結論として、 @JsonFormat は、上記のようにDateおよびCalendarタイプの出力フォーマットを制御するために使用されます。

上記のサンプルコードは、GitHubから入手できます。