2016-09-20 18 views
0

私は、特定のタイムゾーンでCalendarオブジェクトを直列化および逆シリアル化する方法を理解しようとしています。ジャクソンが自分のタイムゾーンを尊重し、カレンダーのインスタンスを指定されたタイムゾーンに維持できるようにすることは合理的だと思っています。シリアライズしてもデシリアライズはしません。私は間違って何をしていますか?ジャクソンを使用して特定のタイムゾーンでカレンダーを取得する方法は?

import com.fasterxml.jackson.databind.ObjectMapper; 
import java.util.Calendar; 
import java.text.SimpleDateFormat; 
import java.util.TimeZone; 
import java.io.ByteArrayOutputStream; 

public class JacksonTimeZoneTest2 { 
    public Calendar time; 

    public static void main(String[] args) throws java.io.IOException { 
     JacksonTimeZoneTest2 test = new JacksonTimeZoneTest2(); 
     test.time = new java.util.GregorianCalendar(2014, Calendar.SEPTEMBER, 1); 
     ObjectMapper mapper = new ObjectMapper(); 
     SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z"); 
     sdf.setTimeZone(TimeZone.getTimeZone("CET")); 
     mapper.setDateFormat(sdf); 
     ByteArrayOutputStream serialized = new ByteArrayOutputStream(); 
     mapper.writeValue(serialized, test); 
     String json = serialized.toString(); 
     if (json.contains("CEST")) { 
      System.out.println("It serialized to CET timezone (CEST) [" + serialized.toString() + "]"); 
     } 
     JacksonTimeZoneTest2 test2 = mapper.readValue(serialized.toString(), JacksonTimeZoneTest2.class); 
     if (! "CET".equals(test2.time.getTimeZone().getID())) { 
      System.out.println("Problem! It deserialized to [" + test2.time.getTimeZone().getID() + "] instead of CET"); 
     } 
    } 
} 

私は次の出力を取得し、コードを実行すると:私はまた、タイムゾーンを指定JsonFormatアノテーションで試してみました

It serialized to CET timezone (CEST) [{"time":"Mon, 01 Sep 2014 08:00:00 CEST"}] 
Problem! It deserialized to [UTC] instead of CET 

を、と私は同じ結果を得ました。私はan issue against Jacksonと記録しました。

+0

いつものように、まずはあなたがジャクソンの最新バージョンを使用していることを確認することです。現在、少なくとも2.7(0.7)、2.8でない場合(0.3)。 – StaxMan

+0

申し訳ありませんが、2.8.3でテストしていることを忘れてしまいました –

答えて

0

マッパーのタイムゾーンを設定すると機能します。

public class JacksonTest { 
    public Calendar time; 

    public static void main(String[] args) throws java.io.IOException { 

     JacksonTest obj = new JacksonTest(); 
     obj.time = new java.util.GregorianCalendar(2014, Calendar.SEPTEMBER, 1); 

     SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z"); 
     // Can even remove the sdf TimeZone... 
     //sdf.setTimeZone(TimeZone.getTimeZone("CET")); 

     ObjectMapper mapper = new ObjectMapper(); 
     mapper.setDateFormat(sdf); 
     mapper.setTimeZone(TimeZone.getTimeZone("CET")); 

     ByteArrayOutputStream serialized = new ByteArrayOutputStream(); 
     mapper.writeValue(serialized, obj); 

     JacksonTest obj2 = mapper.readValue(serialized.toString(), JacksonTest.class); 

     System.out.println(serialized); 
     //{"time":"Mon, 01 Sep 2014 09:00:00 CEST"} 

     System.out.println(obj2.time.getTimeZone().getID()); 
     //CET 

    } 
} 

しかし、私はシリアライザはそのままそれを維持しながら、デシリアライザは、カレンダーのタイムゾーンを無視する理由として、あなたの質問に答えていないことを推測します。

+0

ありがとうございました。私は完全に私の問題を解決していないので、オブジェクトをdbに/から永続化するライブラリを作成しているからです。私はオブジェクトを所有していません - 私の図書館のユーザーは行います。 devsはさまざまなタイムゾーンをオブジェクトに持たせたいので、オブジェクトをデシリアライズする前にmapper.setTimeZoneに渡すタイムゾーンを知ることはできません。 –

関連する問題