1概要

この記事では、Jacksonで

@ JsonFormat

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

具体的には、このアノテーションは

SimpleDateFormat

フォーマットに従って

Date



Calendar

値をフォーマットする方法を指定することを可能にします。


2 Mavenの依存関係


@ JsonFormat

はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.fasterxml.jackson.core%22%20AND%20a%3A%22jackson-databind%で定義されています22[jackson-databind]パッケージなので、次のMaven依存関係が必要です。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.4</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. ゲッターでアノテーションを使う


createdDate

フィールドをシリアル化する形式を指定するために

@ JsonFormat

を使用しましょう。これは、この変更のために更新されたUserクラスです。

createdDate

フィールドには、日付形式を指定するために、図のように注釈が付けられています。


pattern

引数に使用されるデータ形式は、


SimpleDateFormat


:で指定されます。

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "[email protected]:mm:ss.SSSZ")
private Date createdDate;

この変更を加えて、プロジェクトをもう一度ビルドして実行します。出力は以下のとおりです。

{"firstName":"John","lastName":"Smith","createdDate":"[email protected]:53:34.740+0000"}

ご覧のとおり、

createdDate

フィールドは

@ JsonFormat

アノテーションを使って指定された

SimpleDateFormat

フォーマットを使ってフォーマットされています。

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

たとえば、呼び出し時に計算されているプロパティがあるとします。そのような場合には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 = "[email protected]:mm:ss.SSSZ", locale = "en__GB")
public Date getCurrentDate() {
    return new Date();
}


3.4. 形を指定する


shape



JsonFormat.Shape.NUMBER

に設定して

@ JsonFormat

を使用すると、

Date

typesのデフォルトの出力になります – エポック

__.


からの経過秒数として。パラメーター

pattern__はこの場合には適用されず、無視されます。

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

出力は以下のとおりです。

{ ..., "dateNum":1482054723876 }


4結論

結論として、

@ JsonFormat

は、上記のように

Date

および

Calendar

タイプの出力形式を制御するために使用されます。

上に示したサンプルコードはhttps://github.com/eugenp/tutorials/tree/master/jackson[GitHubで利用可能]です。