8

Jackson を使用して Joda DateTime オブジェクトをシリアライズしてからデシリアライズしようとしていますが、オブジェクトを完全にデシリアライズしません。タイムゾーン情報が失われているようです。

このコード:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
mapper.configure(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS , false);

DateTime dt = DateTime.now();
String j = mapper.writeValueAsString(dt);
DateTime dt2 = mapper.readValue(j, DateTime.class);

System.out.println("json: " + j);
System.out.println("eq? " + (dt.equals(dt2)));
System.out.println("dates:\n" + dt + "\n" + dt2);

これを出力します:

json: "2013-10-18T14:10:52.458-07:00"
eq? false
dates:
2013-10-18T14:10:52.458-07:00
2013-10-18T21:10:52.458Z

これは設計によるものですか?自分のシリアライザー/デシリアライザーを書く以外に、ここでできることはありますか? SOでこれに関するいくつかの質問を見てきましたが、この側面を具体的に扱っているものはありません。

Joda 2.1 と Jackson 2.1 を使用しています

4

3 に答える 3

8

はい、これは仕様です。JodaTimeDateTimeSerializerは標準の toString() メソッドを使用します。JodaTime の公式ガイド によると、DateTime の標準 ISO8601 文字列がtoString()返されます。また、標準では常に UTC 日時が作成されます。DateTimeDeserializer

TimeZone を保存するには、同じ json で個別に保存し.withZone()、逆シリアル化後にメソッドを使用するか、単にシリアライザーとデシリアライザーを作成する必要があります。

アップデート

バージョン 2.2.3 では、少し拡張された動作があります -DateTimeDeserializerから取得した timeZone で DateTime を作成しDeserializationContextます。で変更される場合がありますObjectMapper.setTimeZone()。デフォルトはTimeZone.getTimeZone("GMT")

于 2013-10-18T23:13:40.410 に答える