1. ホーム
  2. java

Jacksonを使用してJSの日付をデシリアライズする方法は?

2023-11-28 17:07:56

質問

ExtJSから日付文字列をフォーマットで取得しています。

"2011-04-08T09:00:00"

この日付をデシリアライズしようとすると、タイムゾーンがインド標準時に変更されてしまいます(時刻に+5:30が追加されます)。これは、私が日付をデシリアライズする方法です。

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

これをやってもタイムゾーンは変わりません。私はまだISTで日付を取得します。

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

Timezoneの煩わしさを感じさせない方法で、日付をデシリアライズするにはどうしたらよいでしょうか?

どのように解決するのですか?

回避策を見つけたのですが、これでは、プロジェクト全体で各日付のセッターに注釈を付ける必要があります。ObjectMapper を作成する際に形式を指定する方法はありますか。

以下は私が行ったことです。

public class CustomJsonDateDeserializer extends JsonDeserializer<Date>
{
    @Override
    public Date deserialize(JsonParser jsonParser,
            DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String date = jsonParser.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

    }

}

そして、各Dateフィールドのセッターメソッドにこのようなアノテーションを付けます。

@JsonDeserialize(using = CustomJsonDateDeserializer.class)