2014-12-06 100 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]}]}