2013-06-28 17 views
5

私はフィールドの1つにorg.apache.commons.collections.list.LazyListを使用するオブジェクトを持っています。これはシリアル化されたJSONです。 JSONは次のようになります。それはデフォルトコンストラクタを見つけることができないので、jacksonを使用してlazylistを逆シリアル化する

List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory) 

は、しかし、ジャクソンObjectMapperに障害が発生した使用して上記のJSONをデシリアライズしようとしている:

 "myObject": ["org.apache.commons.collections.list.LazyList", [ 
      { 
       "attr1": "asdasd", 
       "attr2": 1234 
      } 
     ]], 

オブジェクトフィールドには、次のようになりますLazyList - 理にかなっています。しかし、どのようにしてこのフィールドをデシリアライズできるかを指定することはできますか?

エラーメッセージ:

[コレクション型にはデフォルトコンストラクタ。 、この質問のニーズを恵みを収集するには

:クラスorg.apache.commons.collections.list.LazyListは、[単純型、クラスfoo.bar.MyObject]]

バウンティ-制約が含まれていますカスタムジャーソンデシリアライザを使用して回答する - カスタムデシリアライザはフィールド固有であってはなりません!したがって、特定のタイプのLazyListのカスタム実装を使用するソリューションは、この質問に適切に答えます。

+0

適切に回答することに関連して、賞品のテキストを質問に含める必要があります。 –

+0

これを100%互換にする方法はありません。データが失われるため、LazyListのバッキングリスト実装やファクトリなどの前提条件を設定する必要があります。これらを前提としないでこれを行う唯一の方法は、何らかの形でシリアル化されたJSONにその情報を追加することです。その情報を追加するためにリフレクションを使用する独自のシリアライザを書くことができます。デシリアライザは、その情報を使用してLazyListオブジェクトを作成します(リフレクションを使用して)が、引き続きあなたのファクトリに0-argコンストラクタがあるという前提をしています。 –

+0

"java reflection"のgoogle検索を行い、シリアライザとデシリアライザのコンストラクタの保護された 'collection'と' factory'変数を取得します。または、次のようなヘルプに関するその他の質問を参照してください。http://stackoverflow.com/questions/735230/java-reflection –

答えて

1

以下の解決策は、リストコレクションオブジェクトとコレクションオブジェクトの両方で機能しますが、あなたのものでも機能する可能性があります。

@JsonDeserialize(contentAs=MyObject.class) 
private List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory); 
関連する問題