2015-12-14 72 views
0

目前,我接收到該JSON輸入,這是我有沒有任何控制:(傑克遜)如何反序列化包裝數組?

{ 
    "A" : { 
     "B" : { 
      "B" : [{ 
        "Whatever" : "String", 
        "Number": 123 
       } 
      ], 
      "SiblingObject" : true 
     } 
    } 
} 

基本上,我想反序列化乙陣列B對象內部直接的到A類,而無需創建另一額外的類來包裝B對象。事情是這樣的:

public class A { 

    private List<B> bList; 

    public List<B> getB() { 
     return bList; 
    } 

    @JsonProperty("B") 
    public void setB(List<B> bList) { 
     this.bList = bList; 
    } 
} 

我試着做

public class A { 

    private List<B> bList; 

    public List<B> getB() { 
     return bList; 
    } 

    @JsonProperty("B") 
    public void setB(Map<String, Object> bList) { 
     this.bList = (List<B>) bList.get("B"); 
    } 
} 

,但無濟於事。

任何想法?

+0

我能想到的最簡單的解決辦法是繼續創建包裝類,但隨後通過使用基於字段註釋和忽略的getter/setter方法我將有公共API與你想要的一樣。另一種選擇是使用自定義的JsonDeserializer,但這似乎是解決這個問題的很多工作。 – Pace

回答

0

有一種方法。但是,它需要遍歷輸入JSON兩次。

在第一遍中,您將創建沒有列表的普通A實例。 在第二遍中,您使用Jackson的節點遍歷來到達正確的B對象並從那裏解析。

請參見下面的代碼:

public class WrapperJsonTest { 

    public static void main(String[] args) { 

     ObjectMapper om = new ObjectMapper(); 
     om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("wrapper.json"); 
     A a = null; 
     try { 
      a = om.readValue(in, A.class); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 

     in = Thread.currentThread().getContextClassLoader().getResourceAsStream("wrapper.json"); 
     try { 
      JsonNode node = om.readValue(in, JsonNode.class).get("B").get("B"); 
      JsonParser parser = node.traverse(); 
      List<B> bList = om.readValue(parser, List.class); 
      a.setB(bList); 
      System.out.println(a.isSibling()); 
      System.out.println(a.getB()); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 

    } 

    @JsonIgnoreProperties 
    public static class A { 

     @JsonIgnore 
     private List<B> bList; 
     private boolean sibling; 

     public List<B> getB() { 
      return bList; 
     } 

     public void setB(List<B> bList) { 
      this.bList = bList; 
     } 

     public boolean isSibling() { 
      return sibling; 
     } 

     public void setSibling(boolean sibling) { 
      this.sibling = sibling; 
     } 
    } 

    public static class B { 

     private String whatever; 

     public String getWhatever() { 
      return whatever; 
     } 

     public void setWhatever(String whatever) { 
      this.whatever = whatever; 
     } 

     @Override 
     public String toString() { 
      return whatever; 
     } 

    } 

}