2013-06-28 95 views
5

我有一個對象,它使用org.apache.commons.collections.list.LazyList作爲它的一個字段,這是序列化的JSON。該JSON看起來是這樣的:使用jackson反序列化lazylist

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

對象場是這樣的:

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

但是嘗試使用傑克遜ObjectMapper失敗反序列化JSON以上,因爲它不能找到一個默認的構造函數一個LazyList - 這是有道理的。但是,我怎樣才能指定這個字段可以被反序列化?

錯誤消息:

爲[集合類型沒有默認構造函數;類org.apache.commons.collections.list.LazyList,包含[簡單類型,類foo.bar.MyObject]]

恩惠的約束:

爲了收集恩惠,這個問題需要要使用定製傑克遜解串器進行應答 - 自定義解串器不能是特定於字段的!因此,對於特定類型使用自定義LazyList實現的解決方案將不會充分回答這個問題。

+0

您應該在問題中包含賞金文本,因爲它與正確回答相關。 –

+0

沒有辦法使這100%兼容一切。由於數據丟失,您必須進行假設,例如LazyList的支持List實現和工廠。做出這些假設的唯一方法是將該信息以某種方式添加到序列化的JSON中。您可以編寫自己的序列化程序以使用反射來添加該信息,並且反序列化程序使用該信息(再次使用反射)創建LazyList對象,但是您仍然在做出假設,例如您的工廠具有0-arg構造函數。 –

+0

做一個谷歌搜索「java反射」,並使用它來獲取序列化程序和解串器構造函數的受保護的'collection'和'factory'變量。或者查看其他問題以獲得幫助,例如:http://stackoverflow.com/questions/735230/java-reflection –

回答

1

下面的解決方案同時處理List和Map集合對象,它也可能適用於您的解決方案。

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