2014-12-06 143 views
5

鑑於以下數據爪哇 - 傑克遜嵌套數組

{ 
    "version" : 1, 
    "data" : [ [1,2,3], [4.5,6]] 
} 

我嘗試了以下定義和使用ObjectMapper.readValue(jsonstring, Outer.class)

class Outer { 
    public int version; 
    public List<Inner> data 
} 

class Inner { 
    public List<Integer> intlist; 
} 

我:

無法反序列內的情況下進行的START_ARRAY標記「

在外部類的,如果我說

List<List<Integer> data; 

然後反序列化的作品。

但在我的代碼中,Outer和Inner類有一些業務邏輯相關的方法,我想保留類結構。

我知道問題在於傑克遜無法將內部數組映射到「內部」類。我必須在傑克遜使用樹模型嗎?還是有,我仍然可以在這裏使用DataModel?

回答

4

傑克遜需要知道如何從int數組中創建Inner實例。的乾淨的方法是聲明一個對應的構造,並與the @JsonCreator annotation.

這裏將其標記是一個例子:

public class JacksonIntArray { 
    static final String JSON = "{ \"version\" : 1, \"data\" : [ [1,2,3], [4.5,6]] }"; 

    static class Outer { 
     public int version; 
     public List<Inner> data; 

     @Override 
     public String toString() { 
      return "Outer{" + 
        "version=" + version + 
        ", data=" + data + 
        '}'; 
     } 
    } 

    static class Inner { 
     public List<Integer> intlist; 

     @JsonCreator 
     public Inner(final List<Integer> intlist) { 
      this.intlist = intlist; 
     } 

     @Override 
     public String toString() { 
      return "Inner{" + 
        "intlist=" + intlist + 
        '}'; 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     final ObjectMapper mapper = new ObjectMapper(); 
     System.out.println(mapper.readValue(JSON, Outer.class)); 
    } 

輸出:

Outer{version=1, data=[Inner{intlist=[1, 2, 3]}, Inner{intlist=[4, 6]}]}