You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何解析MongoDB导出的无逗号分隔多JSON对象文件

问题原因

你拿到的是MongoDB默认导出的*JSON Lines(NDJSON/行式JSON)*格式,该格式的规则是每个独立JSON对象单独存在,不需要外层数组包裹,也不需要对象之间加逗号分隔。你原本的代码是将整个文件按照标准JSON数组格式解析,因此只能读取到第一个对象就终止了。

15GB的文件完全不需要修改源文件,直接用Jackson的流式解析能力就可以处理,具体方案如下:

方案1:直接解析源文件(最优,无需修改源文件)

用Jackson的流式解析器逐对象读取,全程流式处理不会一次性加载15GB文件到内存,代码示例:

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.FileInputStream;

public class NdjsonParser {
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonFactory jsonFactory = objectMapper.getFactory();

        // 用文件流读取,避免全量加载到内存
        try (FileInputStream inputStream = new FileInputStream("db.json");
             JsonParser jsonParser = jsonFactory.createParser(inputStream)) {

            // 循环读取每个JSON对象,Jackson会自动识别下一个对象的起始位置
            while (jsonParser.nextToken() != null) {
                Table table = objectMapper.readValue(jsonParser, Table.class);
                // 此处直接处理单条数据即可,无需全部存入List减少内存占用
                // 业务逻辑写在这里
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
方案2:转成标准JSON数组(如果需要给其他工具使用)

如果需要将文件转成标准JSON数组格式,直接用系统命令行流式处理即可,全程不会占用过多内存,Linux/Mac下可以直接用sed命令:

sed -e '1i[' -e '$s/$/]/' -e 's/^}/},/' db.json > standard_array.json

如果是Windows系统,可以用PowerShell的流式处理命令实现同等效果。

注意事项
  • 15GB文件不要用任何文本编辑器打开修改,也不要在代码里一次性读取全量内容到内存,避免OOM
  • 优先使用方案1,不需要额外占用磁盘空间存储转换后的文件,处理效率更高

内容的提问来源于stack exchange,提问作者karalis1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:57:06