2016-02-29 55 views
4

我正在使用Jackson將JSON從ReST API反序列化爲使用Jackson的Java對象。使用Jackson反序列化包裝在具有未知屬性名稱的對象中的JSON

我碰到的問題是,一個特定的休息響應返回包裹在由數字標識符引用的對象,像這樣:

{ 
    "1443": [ 
    /* these are the objects I actually care about */ 
    { 
     "name": "V1", 
     "count": 1999, 
     "distinctCount": 1999 
     /* other properties */ 
    }, 
    { 
     "name": "V2", 
     "count": 1999, 
     "distinctCount": 42 
     /* other properties */ 
    }, 
    ... 
    ] 
} 

我(也許是幼稚)的方法來反序列化JSON,直到這一點是創建鏡像POJO,讓傑克遜簡單地自動映射所有的字段,它很好地完成。

問題是,ReST響應JSON對我實際需要的POJO數組有一個動態的數字引用。我無法創建鏡像圖像包裝器POJO,因爲屬性名稱本身既是動態的也是非法的Java屬性名稱。

我很感激任何和我可以調查的路線的所有建議。

+0

A)您的JSON無效:缺少']'。 B)使用對象數組來防止你的問題(如果我對你的示例有足夠的理解,因爲它有點有限) –

+0

A)謝謝;我已經更新了示例JSON B)當然,對象數組恰恰是我的目標,但是我根本無法真正進入數組,因爲它的屬性名稱引用了動態和非法的Java –

回答

3

最簡單的解決方案,無需定製解串器是使用@JsonAnySetter。傑克遜將爲每個未映射的屬性使用此註釋調用該方法。

例如:

public class Wrapper { 
    public List<Stuff> stuff; 

    // this will get called for every key in the root object 
    @JsonAnySetter 
    public void set(String code, List<Stuff> stuff) { 
    // code is "1443", stuff is the list with stuff 
    this.stuff = stuff; 
    } 
} 

// simple stuff class with everything public for demonstration only 
public class Stuff { 
    public String name; 
    public int count; 
    public int distinctCount; 
} 

要使用它,你可以這樣做:

new ObjectMapper().readValue(myJson, Wrapper.class); 

對於你周圍的其他方法可以使用@JsonAnyGetter應在這種情況下返回Map<String, List<Stuff>)

1

我認爲最簡單的解決方案是使用自定義的JsonDeserializer。它允許您逐步解析輸入並僅提取構建對象所需的信息。

下面是一個簡單的例子,如何實現一個自定義解串器:custom jackson deserializer

+0

我擔心它可能會變得醜陋。我會研究這個。 –

相關問題