JSON 工具箱

大文件 JSON 打不开怎么办:按体积选对工具

结论:几十 MB 的 JSON 导出在文本编辑器和在线工具里经常直接卡死,但解析本身只要几百毫秒。本文用一份 45MB、50 万条记录的样本实测各环节耗时与内存,解释行数和节点数才是真正的成本,并给出按文件体积选工具的决策表:在线查看、命令行提取、流式处理与桌面客户端各管一段。

实战约 6 分钟发布于 2026-11-07更新于 2026-11-07
大文件 JSON 按体积选工具的阶梯图:在线工具、命令行与流式解析

一个 45MB 的 JSON 文件,解析只要 249 毫秒;让你等半分钟的是渲染它的 500 万行文本和 350 万个树节点。分不清这两件事,就永远在怪错对象。

一、先实测:解析从来不是瓶颈

很多人双击一个几十 MB 的 .json 导出文件,看到编辑器转圈几十秒,第一反应是「JSON 解析太慢了」。实测结论相反。下面是本机(Node 22)跑的一组数据:样本是 50 万条记录、每条 5 个字段(id、email、active、score、tags),文件压缩后 45MB:

操作 实测结果
JSON.parse 全量解析 249 ms
JSON.stringify(data, null, 2) 美化输出 215 ms
美化后的文本 71 MB、5,000,001 行
树节点总数(记录 + 字段) 约 3,500,001 个
解析后 Node 进程 RSS 313 MB(约 7 倍文件体积)

解析花了两百多毫秒就结束了。也就是说,解析器在你松开鼠标之前就已经干完活了。之后卡住的十几秒甚至几分钟,全部发生在「把结果展示给人看」这一层:文本编辑器要排版 500 万行、逐行做语法高亮、维护撤销缓冲区;树形查看器要给 350 万个节点各建一个 DOM 元素——而浏览器在十万节点量级就会明显吃力,几十万直接失去响应。

这个结论指向一个完全不同的修复方向:别和渲染较劲,换一个不做全量渲染的工具。

二、为什么会卡:行数与节点数才是真成本

文件体积只是表象,真正压垮工具的是两个衍生数字:

  1. 行数。一个 45MB 的紧凑 JSON 美化后是 500 万行。编辑器打开文件时无论你看到哪一屏,都得先为全文建立行结构、决定高亮状态、分配缓冲,成本和总行数成正比。
  2. 节点数。500 万条记录 × (1 个对象 + 5 个字段)就是 350 万个树节点。任何「整棵建树再展示」的查看器都要为它付出同等的内存与时间,和你只展开了一层还是全部展开无关。

由此还能推出两条反直觉的结论:先美化再看是帮倒忙——美化把 45MB 变成 71MB、行数翻 40 倍,纯粹给工具加压;把文件 cat 进终端也是帮倒忙——终端回滚缓冲区会成为新的瓶颈,想看开头几百字节用 head -c 2000 就够。

三、按体积选工具:一张决策表

不同体量的文件,合适的工具完全不同。结合上面的实测和几家工具站的公开指南(OpenFormatter 给出在线工具 2-5MB 舒适区、PureJSON 给出 500MB 文本解析后 2-4GB 内存的量级估计),可以整理成一张决策表:

文件体积 首选 理由
< 2 MB 任何在线工具 打开即看,/parse 这类树形查看 + 校验一步到位
2 – 20 MB 本地编辑器(VS Code 等)或浏览器本地工具 在线工具开始劣化;本地处理无上传
20 – 100 MB 命令行 jq 探查 + 虚拟化树查看器 编辑器开始卡;jq 秒级提取任意片段
100 MB – 1 GB jq --stream / ijson 流式处理 常规解析的内存按 7 倍文件体积涨,装不下就流式
> 1 GB 或持续追加 换格式:NDJSON / CSV / Parquet 单个大数组必须完整解析才有第一条记录,格式本身已经不合适

本站 [/parse](/parse) 覆盖第一档的树形查看与校验;更大的文件建议用 桌面客户端 在本地打开,避免把几十 MB 数据粘进网页。

四、不打开文件,先问它是什么结构

拿到一个陌生的大 JSON,第一件事不是打开,而是花几秒钟摸清结构——用 jq 在 200ms 内回答三个问题:

# 顶层是数组还是对象?多少条记录?
jq 'if type == "array" then {type: "array", count: length} else {type: "object", keys: (keys|length)} end' huge.json

# 第一条记录长什么样(只看一条,不刷屏)?
jq '.[0]' huge.json | head -40

# 全部字段名(从第一条记录取)
jq '.[0] | keys' huge.json

知道结构之后,绝大多数需求就变成「提取某个字段」,根本不需要打开文件。比如只要每个用户的邮箱:

jq -r '.[].email' huge.json | less
# 过滤条件再叠加
jq -r '.[] | select(.active == true) | .email' huge.json

规则很简单:要「看」就找虚拟化渲染的查看器,要「找」和「取」就用 jq,两者别混。

五、内存的陡坡:普通模式与流式差 150 倍

同一份 45MB 样本,用 /usr/bin/time -v 实测 jq 两种模式的内存峰值:

模式 命令 内存峰值(RSS) 耗时
普通模式(全量载入) jq '.[0].email' sample.json 542 MB 0.7 s
流式模式 jq --stream 'select(.[0][1]=="email") | .[1]' sample.json 3.6 MB 2.5 s

普通模式把整个文件读进内存再建对象图,542MB 峰值正好印证「对象图 ≈ 7-12 倍文本体积」的量级;--stream 逐个 token 消费输入,内存恒定在个位数 MB,代价是总时间慢一些。文件到了 GB 级,这个差别就是「能跑」和「直接被 OOM 杀掉」的差别:

# 超过内存的文件:--stream 是唯一不载入全量的方式
jq --stream -n 'fromstream(1|truncate_stream(inputs))' huge.json

Python 侧的等价物是 ijson:ijson.items(f, 'item') 逐条产出数组元素,同样常数内存。这些工具的共同点是放弃了随机访问——流式只能从头到尾过一遍,要第二次就得再过一遍。

六、浏览器里能看多大:本地处理的边界

在线工具不是不能用,而是有边界。现代浏览器单标签页内存上限大致 1-4GB,一个 45MB 文件解析成对象图加树渲染,通常还能撑住;到了几百 MB 就接近悬崖。选在线工具时认准三点:

  1. 处理在本地完成(粘贴内容不发往服务器),既保护数据也省上传时间——本站所有工具都是纯前端实现,断网也能用;
  2. 解析放 Web Worker,主线程不冻结,卡了还能关掉标签页而不是整个浏览器;
  3. 树是虚拟化或懒展开的,折叠的分支几乎零成本,展开多少渲染多少。

以本站为例:[/parse](/parse) 的树形查看适合几十 MB 以内的文件定位结构,配合错误行列定位排查语法;再大的文件交给 jq 或桌面端,浏览器只负责小片段的确认。

七、格式选对了,问题少一半

如果你能影响文件的生成方,与其换更强的查看器,不如让它别长成「一个巨大的数组」:

  • NDJSON/JSONL:一行一条记录,追加写入不重写全文件,head、grep、tail、split 全套文本工具直接可用;文件被截断只损失最后一行。本站 JSONL 手册里有完整的坏行排错流程。
  • 分页导出:10 万条记录的 API 响应应该支持分页参数,一次 100 条,对双方都友好。
  • 表形数据别用 JSON:一行一条、字段固定没有嵌套的数据,本质是表格,CSV 或 Parquet 更省空间、生态也更强。

实测里有个可以记住的数字:把一个 50 万条的数组从中间截断,前一半依然是一个合法的 NDJSON 文件(丢一半记录),而对应的单个大数组则整个作废——501 条只恢复出 500 条,总比 0 条强。

八、检查清单

  • 先用 jq '.[0] | keys' 或抽样 500 条摸清结构,再决定怎么处理;
  • 不要先美化再打开——行数翻倍只会更卡;
  • 2MB 以下在线树形查看,20MB 以上命令行,1GB 级一律 --stream 或 ijson;
  • 确认在线工具是本地处理(粘贴内容不出浏览器);
  • 能改生成方就切 NDJSON 或分页,从源头消灭巨型单数组。

常见问题

为什么编辑器打开 JSON 要几十秒,程序里解析却只要 200 多毫秒?

解析是原生代码把文本变成数据结构,45MB 样本实测 249ms。编辑器卡在展示层:500 万行文本要排版、高亮、建撤销缓冲;树形视图要为 350 万个节点建 DOM。换虚拟化渲染的查看器或直接用 jq 提取即可绕开。

jq 处理 1GB 以上的 JSON 文件会溢出吗?

普通模式会——它把整个文档载入内存,对象图峰值约是文件的 7-12 倍。加 --stream 后逐 token 消费输入,实测 45MB 文件内存峰值 3.6MB,文件多大内存都不涨,代价是只能顺序遍历一遍。

在线 JSON 工具最多能看多大的文件?

多数在线工具的舒适区在 2-5MB,10MB 以上明显劣化。硬上限取决于浏览器标签页内存(约 1-4GB),但几十 MB 时解析加建树的等待已经很痛苦。超过 20MB 建议换本地工具或命令行。

大 JSON 文件怎么只看某个字段的值?

用 jq 提取,不要打开全文:jq -r '.[].email' huge.json 输出所有 email;加过滤 jq -r '.[] | select(.active == true) | .email'。要看前几条用 jq '.[0:5]' huge.json,比打开文件快几个数量级。

先美化再打开文件有帮助吗?

没有。美化把紧凑的 45MB 变成 71MB、行数从 1 行变 500 万行,给编辑器和查看器增加的都是纯负担。只有最终要给人读、且文件不大的情况下才值得美化。