Java - Jackson 嵌套数组

2022-09-04 22:08:05

给定以下数据

{
   "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 类具有一些与业务逻辑相关的方法,我希望保留类结构。

我知道问题是 Jackson 无法将内部数组映射到 “Inner” 类。我必须在杰克逊中使用树模型吗?或者我还能在这里使用数据模型吗?


答案 1

Jackson 需要知道如何从整数数组创建实例。最干净的方法是声明相应的构造函数,并使用@JsonCreator注释对其进行标记。Inner

下面是一个示例:

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]}]}

答案 2