Java - Jackson嵌套数组

Alk*_*lki 8 java arrays json nested jackson

鉴于以下数据

{
   "version" : 1,
   "data" : [ [1,2,3], [4.5,6]]
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下定义并使用 ObjectMapper.readValue(jsonstring, Outer.class)

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

class Inner {
   public List<Integer> intlist;
}
Run Code Online (Sandbox Code Playgroud)

我有:

无法反序列化START_ARRAY标记内部的实例"

在外课,如果我说

List<List<Integer> data;
Run Code Online (Sandbox Code Playgroud)

然后反序列化工作.

但是在我的代码中,Outer和Inner类有一些与业务逻辑相关的方法,我想保留类结构.

我知道问题是杰克逊无法将内部数组映射到"内部"类.我必须在杰克逊中使用树模型吗?或者有些我仍然可以在这里使用DataModel?

Ale*_*lov 9

Jackson 需要知道如何Inner从整数数组创建实例。最简洁的方法是声明一个相应的构造函数并用@JsonCreator 注释标记它

下面是一个例子:

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));
    }
Run Code Online (Sandbox Code Playgroud)

输出:

Outer{version=1, data=[Inner{intlist=[1, 2, 3]}, Inner{intlist=[4, 6]}]}
Run Code Online (Sandbox Code Playgroud)