使用Jackson解析大型非模式化json文件?

时间:2012-06-08 16:19:37

标签: json jackson file-processing

我在磁盘上有一个非常大的.json文件。我想使用Jackson解析器将其实例化为Java对象。

该文件如下所示:

[ { "prop1": "some_value",
    "prop2": "some_other_value",
    "something_random": [
      // ... arbitrary list of objects containing key/value 
      //     pairs of differing amounts and types ...
    ]
  },
  // ... repated many times ...
  {
  }
]

基本上它是一个很大的对象数组,每个对象都有两个标识它的字符串属性,然后是另一个内部对象数组,其中每个对象是属性和值的随机集合,主要是字符串和整数,但是也包含数组。

由于这个对象布局,我没有可以用来轻松实例化这些对象的设置模式。使用org.json处理器需要尝试为整个文件分配一个字符串,该字符串由于其大小而经常失败。所以我想使用流解析器,但我完全不熟悉它。

我最终想要的是一个Map,其中String是prop1的值,SomeObject是保存整个对象(顶级数组条目)的数据的东西。也许只是JSON,然后可以在需要时解析它?

无论如何,关于如何为此编写代码的想法是受欢迎的。

1 个答案:

答案 0 :(得分:3)

由于您不希望将整个事物绑定为单个对象,因此您可能希望使用readValues() ObjectReader方法。如果单个值的结构是通用的,您可能希望将它们绑定为java.util.Map s或JsonNode s(杰克逊的树模型)。所以你会做类似的事情:

ObjectMapper mapper = new ObjectMapper();
ObjectReader reader = mapper.reader(Map.class); // or JsonNode.class
MappingIterator<Map> it = reader.readValues(new File("stuff.json"));
while (it.hasNextValue()) {
   Map m = it.nextValue();
   // do something; like determine real type to use and:
   OtherType value = mapper.convertValue(OtherType.class);
}

迭代整个事情。