2012-10-20 52 views
0

我使用的Restlet調用返回對象的JSON數組的API。當進行類似的調用來撤回單個對象時,所有東西都被正確地映射到自定義類,但是當我將數組拉回來時,Object被映射爲LinkedHashMap而不是此自定義對象。我確定我只需要定義如何正確反序列化數組,但我還沒有弄清楚如何做到這一點。對象的反序列化JSON陣列使用的Restlet /傑克遜

@Get("json") 
public Trait getTrait(); 

@Get("json") 
public HashSet<Trait> getTraits(); 

前者工作正常,但後者不起作用。最終,當我嘗試遍歷HashSet時,我可以發生這樣的錯誤:java.util.LinkedHashMap不能轉換爲com.test.traits.Trait。

任何幫助,將不勝感激。

回答

2

這通常是因爲類型爲類傳入(如HashSet)代替一般類型(HashSet<Trait>)。如果是這樣,這相當於HashSet<Object>,傑克遜已經沒有選擇,但內容綁定到可用的最簡單的對象類型匹配這只是某種java.util.Collection

這聽起來像的Restlet不正確地傳遞泛型類型信息出於某種原因。

有變通這樣:

  • 使用一個包裝對象,使List S和Map s爲總是一個Java對象,從不根級別值的屬性。這確保了各類工作,即使的Restlet沒有通過泛型類型爲根值
  • 子類HashSet,讓您有非通用型;隨後傑克遜可以計算出通用類型HashSet

對於第二種情況,你就這樣做:

public class MyTraits extends HashSet<Trait> { } 

@Get("json") 
public MyTraits getTraits(); 

,它會工作,因爲MyTraits沒有泛型類型它自己的;但它的超類型聲明具有傑克遜可用的通用參數。

+0

後者的工作。我實際上已經嘗試過,但是我的新系列也有泛型。我一拿出所有的東西,一切都奏效了。 – Nick