2012-08-26 26 views
1

我打電話給一個休息服務,返回一個JSON對象。我試圖使用Jackson和數據綁定來反序列化對我的Java Beans的響應。傑克遜數據綁定異構Json對象

示例JSON是這樣的:

{ 
    detail1: { property1:value1, property2:value2}, 
    detail2: { property1:value1, property2:value2}, 
    otherObject: {prop3:value1, prop4:[val1, val2, val3]} 
} 

實質上,detail1和detail2是相同的結構,並因此可以通過一個單一的類型來表示,而OtherObject是另一種類型的。

目前,我已經設置了我的類別如下(這是我寧願結構):

class ServiceResponse { 
    private Map<String, Detail> detailMap; 
    private OtherObject otherObject; 

    // getters and setters 
} 

class Detail { 
    private String property1; 
    private String property2; 

    // getters and setters 
} 

class OtherObject { 
    private String prop3; 
    private List<String> prop4; 

    // getters and setters 
} 

然後,就這樣做:

String response = <call service and get json response> 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(response, ServiceResponse.class) 

的問題是我迷失方向閱讀有關如何正確配置映射和註釋以獲得我想要的結構的文檔。我想要detail1,detail2創建Detail類,使用otherObject創建一個OtherObject類。但是,我也希望細節類可以存儲在地圖中,以便它們可以很容易地區分和檢索,以及未來的服務將返回detail3,detail4等的事實。 ,Map in ServiceResponse看起來像 "{detail1:Detail object, detail2:Detail object, ...})。

這些類應該如何註釋?或者,也許有更好的方法來構建我的類來適應這個JSON模型?感謝任何幫助。

回答

3

只需在ServiceResponse在2 ARGS方法使用@JsonAnySetter,就像這樣:

@JsonAnySetter 
public void anySet(String key, Detail value) { 
    detailMap.put(key, value); 
} 

心靈你,你只能有一個「財產」與@JsonAnySetter因爲它的未知性的回退。請注意,JsonAnySetter的javadoc不正確,因爲它聲明它應該應用於1-arg方法;你可以隨時在傑克遜打開一個小錯誤;)

+0

啊,那有效。我已經放棄了大部分的文檔,因爲大多數人似乎都把它作爲真正知識的來源:D。 – nsx241