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實現的解決方案將不會充分回答這個問題。
您應該在問題中包含賞金文本,因爲它與正確回答相關。 –
沒有辦法使這100%兼容一切。由於數據丟失,您必須進行假設,例如LazyList的支持List實現和工廠。做出這些假設的唯一方法是將該信息以某種方式添加到序列化的JSON中。您可以編寫自己的序列化程序以使用反射來添加該信息,並且反序列化程序使用該信息(再次使用反射)創建LazyList對象,但是您仍然在做出假設,例如您的工廠具有0-arg構造函數。 –
做一個谷歌搜索「java反射」,並使用它來獲取序列化程序和解串器構造函數的受保護的'collection'和'factory'變量。或者查看其他問題以獲得幫助,例如:http://stackoverflow.com/questions/735230/java-reflection –