杰克逊多个对象和巨大的json文件

时间:2012-05-02 09:27:46

标签: java json jackson

我觉得答案可能与此重复:Jackson - Json to POJO With Multiple Entries但我认为这个问题可能不同。我也使用原始数据绑定而不是完整数据绑定。

就像那个问题的提问者一样,我在文件中有多个对象,我正在尝试将它们转换为POJO并将它们填充到我的设计数据库中,这样我就可以快速而不是慢慢地访问数据。

这里的文件大小为几十GB,每个文件中有多达数百万个对象。无论如何,这是我到目前为止:

ObjectMapper mapper = new ObjectMapper();
Map<String,Object> data = mapper.readValue(new File("foo.json"), Map.class);
System.out.println(data.get("bar"));

这对于在foo中打印第一个对象的bar元素非常有用,但是我需要一种方法来迭代遍历每个元素,不会占用我所有的内存。

感谢。

3 个答案:

答案 0 :(得分:11)

您不必在Streaming(JsonParser)和ObjectMapper之间进行选择,同时执行这两项操作! 使用解析器遍历一下,但随后调用JsonParser.readValueAs(MyType.class)绑定单个JSON对象。

或者,调用ObjectMapper的{​​{1}}方法在适当的点传递JsonParser。或者使用readValue()并以这种方式迭代。

答案 1 :(得分:8)

使用此代码示例查看基本概念。

final InputStream in = new FileInputStream("json.json");
try {
  for (Iterator it = new ObjectMapper().readValues(
      new JsonFactory().createJsonParser(in), Map.class); it.hasNext();)
    System.out.println(it.next());
}
finally { in.close();} }

答案 2 :(得分:1)

假设您有一个包装对象的数组,请创建一个JsonParser,然后使用适当的类型调用readValuesAs。它会为您提供一个Iterator,其中包含您在使用对象时读取文件的所有对象。