我想知道如何处理大型JSON文件。

我不想将它们存储在内存中,所以我不想执行JsonNode,因为我认为这会将整个树存储在内存中。

我的另一个想法是使用TokenBuffer。但是,我想知道这是如何工作的。 TokenBuffer是否也存储整个文档?有最大限制吗?我知道这是最佳性能,但是如果我这样做:

TokenBuffer buff = jParser.readValueAs(TokenBuffer.class);


似乎它一次读取了整个文档(我不想要)。

最佳答案

TokenBuffer的目的是在内存中存储JSON令牌的可扩展数组。它通过首先创建1个Segment对象和16个JsonToken对象,然后根据需要添加新的Segment对象来实现。

您猜对了整个文档都将被加载到内存中,这是正确的。唯一的区别在于,它不是存储字符数组,而是存储令牌。根据docs的性能优势:


您可以重新处理JSON令牌,而无需从文本表示中重新解析JSON内容。
如果要按所有令牌在缓冲区中追加的顺序进行迭代,速度会更快。


TokenBuffer不是内存中磁盘文件的低级缓冲区。

我只想解析一个文件而不将其全部一次加载到内存中,请跳过TokenBuffer。只需createJsonParserJsonFactory中的MappingJsonFactory并使用nextToken获取令牌。 Example

08-27 22:55