Java Jackson有多个对象和巨大的json文件

Java Jackson有多个对象和巨大的json文件,java,json,jackson,Java,Json,Jackson,我觉得答案可能是重复的:但我认为这个问题可能已经足够不同了。另外,我使用的是原始数据绑定,而不是完整数据绑定 所以就像那个问题的提问者一样,我在一个文件中有多个对象,我正试图将它们转换成POJO,并将它们填充到我设计的数据库中,这样我就可以快速而不是缓慢地访问数据 此处的文件大小为数十GB,每个文件中最多包含数百万个对象。不管怎么说,到目前为止,我得到的是: ObjectMapper mapper = new ObjectMapper(); Map<String,Object> da

我觉得答案可能是重复的:但我认为这个问题可能已经足够不同了。另外,我使用的是原始数据绑定,而不是完整数据绑定

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

此处的文件大小为数十GB,每个文件中最多包含数百万个对象。不管怎么说,到目前为止,我得到的是:

ObjectMapper mapper = new ObjectMapper();
Map<String,Object> data = mapper.readValue(new File("foo.json"), Map.class);
System.out.println(data.get("bar"));
ObjectMapper mapper=new ObjectMapper();
Map data=mapper.readValue(新文件(“foo.json”)、Map.class);
System.out.println(data.get(“bar”);
这对于在foo中打印第一个对象的bar元素非常有用,但是我需要一种方法来迭代每个元素,这种方法不会占用我所有的内存


谢谢。

使用此代码示例了解基本思想

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();} }

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


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

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

并且您的文件表示一个JSON对象列表(这使其仅为一个对象),还是只是JSON对象的串联(这将允许您逐个读取)?对JSON了解不多,我认为是后者。文件结构类似:{blah blah blah}{blah blah blah}{etc.}这“可行”,但似乎造成的问题比它解决的问题要多,因为我永远不知道我有什么类型(对象中有包含更多对象的数组),我可能不得不问一个新问题。@Marko很高兴你找到了一个好的方法来解决这个问题,假设类型相同。是的,我知道它可以发挥作用,与杰克逊有着丰富的经验;但魔鬼是在细节上,也就是说,很多小事情都会在关闭河流时出错。重要的一点是,必须使用相同的
JsonParser
,否则第一个将读取并缓冲满输入的块;如果构造了单独的解析器,则该缓冲内容将丢失。@Knyght您也可以将内容读取为
对象
JsonNode
(树模型),而不是
映射
;还可以使用
ObjectMapper.convertValue(map,OtherType.class
动态转换为实际类型。+1用于两者!我一直使用流+数据绑定,它在简单性和内存使用方面都非常好。