Spring BootでのJSON日付のフォーマット

1. 概要

このチュートリアルでは、Spring BootアプリケーションでJSON日付フィールドをフォーマットする方法を示します。
Spring BootがデフォルトのJSONプロセッサーとして使用するlink:/jackson[*Jackson*]を使用して、日付をフォーマットするさまざまな方法を検討します。

2。 _ Date_フィールドで_ @ JsonFormat_を使用する

* 2.1。 フォーマットの設定*

*特定のフィールドをフォーマットするために、link:/jackson-jsonformat[[email protected]_]アノテーションを使用できます__:__ *
public class Contact {

    // other fields

    @JsonFormat(pattern="yyyy-MM-dd")
    private LocalDate birthday;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastUpdate;

    // standard getters and setters

}
_birthday_フィールドでは、日付のみをレンダリングするパターンを使用し、_lastUpdate_フィールドでは時間も含めます。
link:/java-8-date-time-intro[*Java 8 date types *]を使用しました。これは、時間型を扱うのに非常に便利です。 もちろん、_java.util.Dateのようなレガシー型を使用する必要がある場合、_は同じ方法で注釈を使用できます。
public class ContactWithJavaUtilDate {

     // other fields

     @JsonFormat(pattern="yyyy-MM-dd")
     private Date birthday;

     @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
     private Date lastUpdate;

     // standard getters and setters
}
最後に、__ @ JsonFormat __を指定された日付形式で使用してレンダリングされた出力を見てみましょう。
{
    "birthday": "2019-02-03",
    "lastUpdate": "2019-02-03 10:08:02"
}
*ご覧のとおり、__ @ JsonFormat ___annotationを使用すると、特定の日付フィールドをフォーマットできます。*
*ただし、フィールドに特定の書式設定が必要な場合にのみ使用する必要があります。*アプリケーションのすべての日付に一般的な書式を設定する場合は、後で説明するように、これを実現するより良い方法があります。

* 2.2。 タイムゾーンの設定*

また、特定のタイムゾーンを使用する必要がある場合は、@ _ JsonFormatの_timezone_属性を設定できます:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private LocalDateTime lastUpdate;
タイプにすでにタイムゾーンが含まれている場合は、_java.time.ZonedDatetime._などを使用する必要はありません。

3.  デフォルト形式の設定

_ @ JsonFormat_はそれ自体が強力ですが、フォーマットとタイムゾーンをハードコーディングすることで、後を追うことができます。
アプリケーションのすべての日付に対してデフォルトのフォーマットを設定したい場合、より柔軟な方法は、_application.properties_ *で設定することです。
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
JSON日付で特定のタイムゾーンを使用する場合、そのためのプロパティもあります。
spring.jackson.time-zone=Europe/Zagreb
このようにデフォルトの形式を設定することは非常に便利で簡単ですが、*このアプローチには欠点があります。 残念ながら、__LocalDate __and __LocalDateTimeなど、Java 8の日付タイプ*では機能しません。___weは、_java.util.Date_または_java.util.Calendar_のフィールドのフォーマットにのみ使用できます。 *しかし、すぐにわかるように、希望があります。*

*4. Jacksonの_ObjectMapper_ *のカスタマイズ

したがって、Java 8の日付タイプを使用してデフォルトの日付形式を設定する場合は、https://docs.spring.io/spring-boot/docs/current/api/org/springframeworkを作成する必要があります。 /boot/autoconfigure/jackson/Jackson2ObjectMapperBuilderCustomizer.html[_Jackson2ObjectMapperBuilderCustomizer_] Bean:*
@Configuration
public class ContactAppConfig {

    private static final String dateFormat = "yyyy-MM-dd";
    private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
        return builder -> {
            builder.simpleDateFormat(dateTimeFormat);
            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
            builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
        };
    }

}
上記の例は、アプリケーションでデフォルト形式を設定する方法を示しています。 Beanを定義し、__customize __methodをオーバーライドして、目的の形式を設定する必要があります。
このアプローチは少し面倒に見えるかもしれませんが、Java 8と従来の日付型の両方で機能するというのは素晴らしいことです。

5. 結論

この記事では、Spring BootアプリケーションでJSONの日付をフォーマットするさまざまな方法を検討しました。
いつものように、exampleshttps://github.com/eugenp/tutorials/tree/master/spring-boot-data [GitHub]でサンプルのソースコードを見つけることができます。