2012-11-30 87 views
0

我有以下JSON。而我使用的解析器Jackson傑克遜反序列化具有未知屬性名稱的泛型

{ 
    "code": 0, 
    "response": { 
    "pagination": { 
     "page": 1, 
     "limit": 20, 
     "count": 5, 
     "pageCount": 1 
    }, 
    "random": [ 
     .... 
    ] 
    } 
} 

現在我有各種random對象創建簡單POJO類解析它。我期望有3-4種不同類型的random對象。因此,而不是針對不同類型的「隨機」對象的創建不同的包裝類我創建了一個通用的一個

EDITED類:

public class PaginatedResponse<E> { 

    private Pagination pagination; 
    private List<E> responseList; 

    public Pagination getPagination() { 
     return pagination; 
    } 

    public void setPagination(Pagination pagination) { 
     this.pagination = pagination; 
    } 

    public List<E> getResponseList() { 
     return responseList; 
    } 

    public void setResponseList(List<E> responseList) { 
     this.responseList = responseList; 
    } 
} 

現在對於它,我使用貼圖,

JsonNode tree = mapper.readTree(response); 
    TypeReference<PaginatedResponse<LocationParent>> ref = new TypeReference<PaginatedResponse<LocationParent>>() { }; 
    PaginatedResponse<LocationParent> resp = mapper.convertValue(tree.get("response"), ref); 

但我無法映射responseList。我得到pagination對象,但responseList始終爲空。現在如何爲responseList動態提供property name

請幫

+0

通用包裝工作正常,只要您在反序列化時傳遞非泛型類型(否則傑克遜不知道超出它的類型是java.lang.Object)。這可以通過傳遞TypeReference來完成,或者如果它是完全動態的,使用'TypeFactory.constructGenericType()'(或者其他確切的名稱)。但是,只要POJO存在「隨機」,您就不需要使用自定義解串器。 – StaxMan

+0

非常感謝您幫助解決我以前的所有問題。我遵循你的建議並使用了'TypeReference'。已更新我的問題。 – vKashyap

+0

到目前爲止好!這裏缺少的是什麼? – StaxMan

回答

1

你需要的變量值類型是什麼處理的多態類型。單獨使用泛型不會有幫助,因爲反序列化方不知道使用哪種類型。

您可以啓用帶註釋的多態類型處理@JsonTypeInfo;但是在這種特殊情況下的一個問題是,你想要一個任意類型的事物List - 由於類型擦除,所有Java列表實際上只是List<Object>;沒有爲元素打字。

如果是我,我可能會子類PaginatedResponse,只是添加@JsonTypeInfo在基類,如:

@JsonTypeInfo(...) // see javadocs for properties needed 
public abstract class PaginatedResponse<T> { 
    public Pagination pagination; 
    // .. and so on 
} 

public class PaginatedFooResponse<Foo> { } 

之所以用子類在這裏僅僅是有可能使解串器圖out元素類型,給定類型的響應對象。響應對象將具有類型(PaginatedFooResposne),並且該類型的元素可用。

0

試試這個::

JSONObject objJSON = JSONObject.fromString("urString"); 

String code = objJSON.get("code"); 
+0

感謝您的回答。我希望'PaginatedResponse POJO'並且不想通過使用JsonNode手動創建它。我知道這會起作用。但我正在尋找更好的方法。在接受它作爲答案之前將等待。 – vKashyap