【问题标题】:Java - Jackson nested arraysJava - 杰克逊嵌套数组
【发布时间】:2015-02-04 11:08:21
【问题描述】:

给定以下数据

{
   "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 令牌中反序列化 Inner 实例”

在 Outer 类中,如果我说

List<List<Integer> data;

然后反序列化工作。

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

我了解问题在于 Jackson 无法将内部数组映射到“内部”类。我必须在杰克逊使用树模型吗?或者有什么方法我仍然可以在这里使用 DataModel 吗?

【问题讨论】:

    标签: java arrays json nested jackson


    【解决方案1】:

    Jackson 需要知道如何从一个整数数组创建一个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]}]}
    

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2016-01-14
      • 2016-12-07
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多