9

我觉得答案可能与此重复: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 元素非常有效,但我需要一种方法来迭代每个元素,而不会占用我所有的内存。

谢谢。

4

3 回答 3

12

您不必在 Streaming ( JsonParser) 和之间进行选择ObjectMapper,两者都做!用解析器遍历一下,然后调用JsonParser.readValueAs(MyType.class)绑定单个 JSON 对象。

或者,在适当的点调用传递 JsonParserObjectMapper的方法。readValue()或者以ObjectMapper.reader(Type.class).readValues()这种方式使用和迭代。

于 2012-05-02T23:58:03.120 回答
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();} }
于 2012-05-02T09:47:42.323 回答
1

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

于 2012-05-03T01:18:12.097 回答