37

http://wiki.fasterxml.com/JacksonFAQDateHandlingによると、「DateTime は、 java.util.Date の処理方法と同様に、自動的にシリアライズ/デシリアライズできます。」ただし、この自動機能を実行できません。このトピックに関連する StackOverflow の議論がありますが、そのほとんどはコードベースのソリューションに関係していますが、上記の引用に基づいて、単純な構成でこれを達成できるはずです。

http://wiki.fasterxml.com/JacksonFAQDateHandlingごとに、日付をタイムスタンプとして書き込むことが false になるように構成を設定しています。その結果、java.util.Date 型は ISO 8601 形式にシリアライズされますが、org.joda.time.DateTime 型は長いオブジェクト表現にシリアライズされます。

私の環境はこれです:

Jackson 2.1
Joda time 2.1
Spring 3.2
Java 1.6

jsonMapper Bean の私の Spring 構成は

@Bean
public ObjectMapper jsonMapper() {
    ObjectMapper objectMapper = new ObjectMapper();

    //Fully qualified path shows I am using latest enum
    ObjectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.
        WRITE_DATES_AS_TIMESTAMPS , false);

    return objectMapper;
}

私のテストコードスニペットはこれです

Date d = new Date();
DateTime dt = new DateTime(d); //Joda time 
Map<String, Object> link = new LinkedHashMap<String, Object>();
link.put("date", d);
link.put("createdDateTime", dt);

結果の JSON 出力のスニペットは次のとおりです。

{"date":"2012-12-24T21:20:47.668+0000"}

{"createdDateTime": {"year":2012,"dayOfMonth":24,"dayOfWeek":1,"era":1,"dayOfYear":359,"centuryOfEra":20,"yearOfEra":2012,"yearOfCentury":12,"weekyear":2012,"monthOfYear":12 *... remainder snipped for brevity*}}

私の予想では、DateTime オブジェクトは、構成に基づいて Date オブジェクトのオブジェクトと一致する必要があります。私は何を間違っていますか、または何を誤解していますか? Jackson のドキュメントから自動的に単語を読みすぎているのでしょうか。ISO 8601 ではありませんが、文字列表現が生成されたという事実は、宣伝されている自動機能を生成しているのでしょうか?

4

4 に答える 4

51

Jackson ユーザーメーリングリストからこれに対する回答を得ることができました。これは初心者の問題であるため、あなたと共有したいと思いました. Jackson Date FAQ を読んでも、追加の依存関係と登録が必要であることに気づきませんでしたが、それは事実です。こちらの git ハブ プロジェクト ページに記載されています https://github.com/FasterXML/jackson-datatype-joda

基本的に、Joda データ型に固有の Jackson jar に別の依存関係を追加し、そのモジュールの使用をオブジェクト マッパーに登録する必要がありました。コード スニペットを以下に示します。

私のJackson Jodaデータ型Maven依存関係のセットアップでは、これを使用しました:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-joda</artifactId>
    <version>${jackson.version}</version>
</dependency>

Joda シリアライゼーション/デシリアライゼーション機能を登録するには、次を使用しました。

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JodaModule());
objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.
    WRITE_DATES_AS_TIMESTAMPS , false);
于 2012-12-26T16:47:22.253 に答える