2012-12-13 92 views
0

我有一些JSON的格式如下,我試圖與傑克遜解析 -在JSON解析無名映射使用傑克遜

"response":{ 
"response_inner":{ 
"a":{"field1":2,"field2":0,"field3":5,"field4":0,"field5":[{"field5_1":"b","field5_2":1},{"field5_1":"c","field5_2":1}]}, 
"d":{"field1":2,"field2":6,"field3":11,"field4":0,"field5":[{"field5_1":"c","field5_2":1},{"field5_1":"b","field5_2":1}]}, 
"response_inner_bool":false 
} 
} 

這裏的「A」,「B」等都是一些字符串,可以改變每個迴應。

我創建了一個Java對象來表示'response_inner'(我們稱之爲ResponseInner),另一個表示包含該字段的對象(讓我們稱之爲FieldInfo),但我不知道如何解析這使用@JsonCreator和@JsonProperty註釋 - ResponseInner對象可以包含任意數量的String - > FieldInfo映射。

我試圖解析它像這樣 -

public class Response { 
    private ResponseInner responseInner; 

    @JsonCreator 
    public Response(@JsonProperty("response_inner") ResponseInner responseInner) { 
     this.reponseInner = responseInner; 
    } 
} 

public class ResponseInner { 
    private Map<String, FieldInfo> stringToFieldInfoMap; 
    private boolean responseInnerBool; 

    @JsonCreator 
    public ResponseInner(Map<String, FieldInfo> stringToFieldInfoMap, @JsonProperty("response_inner_bool") boolean responseInnerBool) { 
     this.stringToFieldInfoMap = stringToFieldInfoMap; 
     this.responseInnerBool = responseInnerBool; 
    } 
} 

但抱怨這樣的說法#構造函數的0無屬性名稱標註;當多參數構造函數註釋爲Creator時必須有名稱。有關如何解決此問題的任何建議?

回答

0

無論如何,你似乎並沒有在ResponseInner中使用stringToFieldInfoMap。爲什麼你需要將它作爲參數傳遞?

如果你確實需要它,你可以簡單地通過setter來設置它,而不是傳遞給構造函數。

或者,你也許可以利用第三個類來處理響應的實際映射,該映射使用Response對象(這反過來會消耗從其中移除Map的ResponseInner對象)。這實際上可能允許您將映射邏輯與響應邏輯分離。

public class MappedResponse { 
    private Map<String, FieldInfo> stringToFieldInfoMap; 
    private Response response; 

    public MappedResponse(Map<String, FieldInfo> stringToFieldInfoMap, Response response) { 
     this.stringToFieldInfoMap = stringToFieldInfoMap; 
     this.response = response;  
    } 
} 
+0

感謝您的迴應,但不知道我明白這是如何解析JSON樣本,我包括使用傑克遜?此外,我確實需要ResponseInner中的stringToFieldInfoMap,這只是我的代碼的摘錄。 – user654703

+0

@ user654703問題似乎是,您目前有一個參數傳遞給@JsonCreator帶註釋的構造函數,該構造函數僅適用於單個參數方法簽名。我建議在實例化之後將'stringToFieldInfoMap'傳遞給'InnerResponse'類,或者重構類結構。 –

+0

我試着改變代碼來手動分析stringToFieldInfoMap,以便我可以檢測到的情況下,當字符串'correctSpelled'和fieldInfo實際上是一個布爾值,但然後我不知道如何解析FieldInfo從JSON對象('field5'不被識別)。但是這聽起來像你的建議略有不同 - 你可以包含一個代碼示例來說明嗎? – user654703