
去年年底整理浏览器收藏夹时我发现自己收藏的 JSON 工具居然有 8 个从在线格式化工具到 JSON 转 CSV 网站再到浏览器查看插件零零散散躺了一排。说实话看到那一屏书签时我自己都愣了仔细想想过去一年真正处理接口数据、清洗日志、排查配置文件反复在用的其实只有一个命令行工具。这篇文章就想聊聊我是怎么把这 8 个 JSON 工具一个个从收藏夹里删掉最后只留下这个的以及它到底靠什么赢的。1. 先说结论收藏一堆 JSON 工具的根源是“怕被格式打败”1.1 8个工具背后其实是8种场景我当初收藏的 8 个工具看着功能都不一样但拆开来看就是几类。整理一下大概是这么个情况工具类型我当初收藏的理由高频使用场景在线格式化工具 A粘贴即格式化省得自己写脚本快速查看接口返回的紧凑 JSON在线格式化工具 B备用A 偶尔打不开同上JSON 转 CSV 工具把接口数据导成表格给运营数据处理导出JSON 校验器检查配置文件是否合法改完配置文件后验证JSON 压缩工具把美化后的 JSON 压成一行存数据库字段数据入库浏览器 JSON 查看插件在浏览器里直接看接口返回调试接口JSONPath 在线测试工具验证 JSONPath 提取表达式数据提取桌面端 JSON 查看器大文件分页浏览日志分析每个人收藏工具的习惯都差不多遇见一个新需求就去搜一个工具搜到之后往收藏夹里一塞想着“以后肯定会用”。结果三年后一看一半是重复功能一半已经打不开了。我后来给自己定了个规矩收藏任何工具之前先问三个问题——它能脱离网络使用吗它能放进脚本里自动化吗它支持的输入规模边界在哪三个问题里只要有一个不满足它就大概率是临时方案不值得占用收藏位。1.2 数量看着丰富真正动手时却处处卡壳单纯说“格式化”这个操作8 个工具里至少有 4 个能干。但实际工作里JSON 数据处理根本不止“格式化”一个动作。配置文件漏了个逗号、接口返回双层嵌套数组、日志里混着带转义字符的字符串、几十 MB 的 JSON 文件要提取某个字段……这些场景需要的是能组合使用的“瑞士军刀”而不是只能劈柴的斧头。我后来才意识到问题不在于工具数量不够而在于没有一个工具能覆盖校验、提取、转换、压缩、脚本化整条链路。这也是我最终决定只留一个工具的原因。注意不是说在线工具完全不能用而是它只适合一次性、数据不敏感、不会频繁执行的行为。但凡这个 JSON 处理动作要重复执行三次以上就值得改成命令行方案。2. 逐个淘汰8类工具的踩坑实录2.1 在线格式化工具数据安全与打不开的双重打击最早收藏的就是在线格式化工具。当时接口返回的 JSON 粘贴进去点一下按钮缩进和颜色都出来了体验确实流畅。后来遇到两件事让我彻底放弃。第一件事有一次我在调试公司内部业务的接口数据习惯性粘贴到在线工具上反应过来时后背一凉里面包含用户手机号和内部订单号。虽然不一定会出问题但把敏感数据交给陌生的第三方服务本身就是数据安全意识不过关。第二件事某个我常用的在线工具在某次改版之后弹窗广告铺天盖地点哪儿都跳转下载页不开拦截插件根本没法用。与其和广告斗智斗勇不如本地一条命令解决。在线工具对大文件也极不友好。有个收藏过的格式化网站文件超过 5MB 就直接拒绝处理前端渲染卡死。我能理解网页端的性能限制但这种限制恰恰暴露了它的天花板临时看小段数据还行干正事时它就指望不上。2.2 JSON 转 CSV / YAML层级丢失与转义地狱收藏 JSON 转 CSV 工具是因为运营同事经常让我把接口数据导出成表格。这类工具的处理逻辑大多很简单只认“扁平对象组成的数组”。一旦数据里有嵌套对象、数组字段它要么直接傻掉要么把对象变成[object Object]这种垃圾值。更麻烦的是转 CSV 时的引号和转义问题字段里一旦有逗号或引号导出来的表格就全乱掉还得让运营手动修。后来我也试过 JSON 转 YAML 的工具结果转出来的 YAML 缩进混乱导回去直接报错。项目里真正遇到“转格式”需求时靠在线工具基本等于碰运气。这类工具最终一个都没留下来。2.3 浏览器 JSON 插件与桌面查看器只能看不能干浏览器 JSON 查看插件适合直接打开接口 URL 时使用但它的能力边界就是“看”。我想把某个字段批量提取出来插件只能复制不能过滤我想把美化的数据压缩成一行插件没有这个按钮我想对数组做聚合计算更是无从下手。桌面端 JSON 查看器同样如此它的定位是数据浏览器不是数据处理工具。这类工具另一个痛点是跨平台我换了电脑之后插件依赖浏览器账号同步桌面工具则需要重新下载安装配置全部重来。用过几次之后就发现它们的存在感太弱了几乎不影响我的工作流自然也没有保留的必要。2.4 编辑器 JSON 插件绑定特定环境换环境就失效VS Code 里的 JSON 工具插件做得不错语法高亮、格式化、折叠都有我一度很依赖它。直到我在生产服务器上用 vim 检查配置文件时才发现自己根本不会在终端里快速校验一个 JSON。那一刻我意识到“只能在编辑器里用”就是一种脆弱依赖。换个编辑器、换个环境能力就清零。我不是说编辑器插件不好而是它不应该成为你唯一的依赖。尤其是当你处理的不只是单个文件而是几十个分散在不同目录下的 JSON 时插件一次只能处理一个文件效率就很低。以下是淘汰原因速查表工具类别我踩到的核心问题是否可自动化是否隐私安全淘汰评级在线格式化工具广告多、大文件失败否否淘汰在线转换工具嵌套层级丢失、转义混乱否否淘汰浏览器 JSON 插件只能看不能处理否是淘汰桌面 JSON 查看器跨平台差、无法批处理否是淘汰编辑器插件依赖 IDE 环境有限是淘汰注意淘汰不代表功能不好而是在“可重复、可自动化、可迁移”这三个维度上不达标。如果你的需求就是偶尔看一次 JSON在线工具并不是不能选只是它不配占据收藏夹的核心位置。3. 为什么最后留下的是 jq一个命令行工具如何抵掉半管收藏夹3.1 格式化、校验、提取、压缩一条命令覆盖四大基础需求我最常用的四个需求在 jq 里分别对应四种简单用法。格式化输出jq . data.json等价于你在在线工具里点一次“美化”但不需要复制粘贴直接读文件输出。压缩成单行jq -c . data.json适合写入数据库字段或日志系统。校验合法性jq empty data.json如果 JSON 不合法它会直接报错并给出行列号比如parse error: Expected value before , at line 5, column 12这个错误信息比大多数在线工具都清楚。提取字段jq .user.name data.json直接取出嵌套字段不用复制粘贴到工具里再去猜 JSONPath 怎么写。这四条命令基本覆盖了我收藏夹里 4 个工具的工作量。剩下那些转格式、聚合、过滤的需求也能在 jq 里找到更灵活的表达方式。对我来说它是唯一一个让我觉得“处理 JSON 这件事终于被彻底解决了”的工具。3.2 管道与脚本一链到底的自动化价值jq 最值钱的地方在于它天然适合放进管道。比如我要从接口拿数据只保留某个字段并保存到文件一条命令就能完成curl -s https://api.example.com/users | jq .data[] | {id: .id, name: .name} users.txt如果要批量处理一堆 JSON 文件直接写个循环for f in *.json; do jq -r .items[] | select(.active true) | .title $f done这种能力在线工具给不了编辑器插件也给不了。它把“处理 JSON”从一个手工操作变成了可以写进脚本、定时任务、CI/CD 流水线的标准动作。我在做日志分析时经常半夜跑一个 cron 任务定时去拉取接口数据用 jq 提取关键字段再拼接成告警消息推送到群里全程无人工参与。3.3 为什么不是 Python 或 Node 脚本很多人会问JSON 处理直接用 Python 不是更强大吗我承认 Python 强大但“强大”和“顺手”是两码事。假设你只是要看一眼某个字段的值Python 需要写import json with open(data.json) as f: data json.load(f) print(data[user][name])而 jq 只需要一行jq .user.name data.json。对于临时查看、快速过滤、字段提取这类高频低复杂度场景命令行工具的启动成本和表达成本都更低。Python 更适合做复杂的数据清洗、统计分析、与模型训练管线集成jq 更适合做 Shell 环境下随手就来的 JSON 操作。两者不冲突但在“只留一个工具”的前提下jq 的通用性和轻量是它胜出的原因。而且 jq 的内部 DSL 是专门针对 JSON 设计的熟悉了.,[],|,select这几个概念以后表达能力不比用 Python 手写差多少。4. 实操演示用 jq 处理格式化、压缩、校验与接口数据提取4.1 格式化与压缩缩进控制、键排序先准备一个原始 JSON 文件raw.json内容故意写成紧凑格式{users:[{name:张三,age:25,active:true},{name:李四,age:30,active:false}]}格式化查看jq . raw.json默认会输出带两个空格缩进的美化结果。如果想把缩进改成 4 个空格用--indent参数jq --indent 4 . raw.json如果想让键按字母序输出比如统一配置文件的格式加一个-S参数jq -S . raw.json formatted.json压缩成单行jq -c . raw.json min.json注意-c是 compact 的意思输出不会带换行和缩进适合存数据库字段或做日志输出。这个功能替代了我收藏夹里的“JSON 压缩工具”而且压得干净利落。4.2 校验与错误定位从报错信息反推问题校验一个 JSON 文件是否合法用jq empty raw.json如果文件有语法错误比如少了一个逗号echo {a: 1 b: 2} | jq empty输出parse error: Expected separator between values at line 1, column 10column 10指向的就是a: 1和b: 2之间缺失逗号的位置。实际排查时尤其面对那种从接口复制下来的超长字符串报错位置能帮你快速锁定是哪一层括号出了问题。有一次我排查一个线上配置文件整份文件只有一行长度超过 2000 个字符错误信息直接告诉我第 1783 个字符附近的括号没闭合节省了大量肉眼排查时间。4.3 字段提取与数组操作select、map、聚合一条龙从上面那个用户数组里提取所有active为true的用户姓名jq -r .users[] | select(.active true) | .name raw.json输出张三-r参数表示 raw output去掉字符串引号方便直接拼接进文本或写进管道里。如果你想保留 JSON 结构就不加-r输出仍然是 JSON 格式的对象这也是 jq 的细节设计很实用的地方。统计所有用户的平均年龄jq [.users[] | .age] | add / length raw.json这里add是求和length是求数量两者相除得到平均值。管道符|的使用逻辑是“把前面处理好的结果交给下一条指令”理解了这个心智模型很多复杂表达式都能自己拼出来。我在处理数据报表时经常这样临时算一下分布不需要写 Python 脚本就能快速拿到结论。4.4 与接口调试和 Python 数据处理配合调试接口时最常用的组合是curl加jqcurl -s https://api.github.com/repos/stedolan/jq/releases | jq .[0].tag_name这个例子只是演示思路实际场景里可以换成任何需要调用的 API。返回结果直接变成变量省去复制粘贴。我在处理一批模型训练数据时也从 JSON 文档里批量提取字段并统计分布例如用jq .labels | group_by(.) | map({key: .[0], count: length})快速做一次标签分布统计然后再交回给 Python 做深度清洗。你会发现jq 承担的是“快速探查数据形态”的角色Python 承担的是“重处理”的角色两者配合起来比单独用任何一方都顺手。4.5 处理带 BOM 的 JSON 文件这里单独提一个坑。Windows 环境下有些编辑器保存文件时会带上 UTF-8 BOM 头直接jq . file.json会报错parse error: Invalid literal at line 1, column 0处理方式是用sed把 BOM 去掉再交给 jqsed 1s/^\xEF\xBB\xBF// file.json | jq .这是我从实际项目里踩坑之后总结出来的网上不少教程都没提过。遇到这种报错别急着怀疑 jq 坏了先检查文件头是不是多了几个字节。5. 常见问题与排查技巧实录5.1 中文输出乱码该怎么办jq 默认输出 UTF-8正常情况下终端能直接显示中文。如果出现中文乱码先检查终端编码Windows 的 PowerShell 可以执行chcp 65001切换为 UTF-8 代码页macOS 终端一般不需要额外设置。另外如果 JSON 里自带\uXXXX转义jq 也能在输出时自动还原成中文字符不需要额外参数。有些在线工具反而会把中文转成\u看起来特别难受这也是我切换到本地命令行工具后体会到的另一个好处。5.2 大文件处理卡顿或内存不足jq 在处理几百 MB 的单一 JSON 对象时会占用较多内存因为默认模式需要先解析整个文档。对于超大日志文件比如按行存储的 JSON Lines建议用类似这样的方式逐行过滤jq -c select(.type error) huge.jsonl如果是单个超大 JSON 数组可以用jq --stream做流式消费但这属于进阶用法。日常遇到大文件我一般先压缩后再处理或者先用head -n 100截取一部分看结构避免直接卡死终端。5.3 安装与命令找不到的问题不同系统的安装方式很简单macOSbrew install jqDebian/Ubuntuapt install jqWindowswinget install jq或下载 exe 放到 PATH如果你在 Windows 环境不支持 winget可以直接下载 jq.exe然后把所在目录添加到环境变量 PATH就能在 CMD 和 PowerShell 里使用。装完以后先跑一下jq --version确认没问题再往下操作。5.4 常见问题速查表问题现象常见原因解决办法parse error: Invalid literal文件带 BOM 头sed 1s/^\xEF\xBB\xBF// file.json | jq .输出内容带引号忘了加-r用jq -r输出裸字符串中文字符乱码终端编码不对Windows 执行chcp 65001大文件卡死单次加载整个文档改用--stream或head截取命令找不到未安装或未加入 PATH按系统安装后检查 PATH5.5 我的一个使用习惯建议最后分享一个我自己长期使用的习惯不要只记jq命令本身把你常用的表达式存成 shell 函数或别名。比如我经常要取data数组里status为ok的name字段就在.bashrc里加了一个函数jqok() { jq .data[] | select(.status ok) | .name $1 }这样输入jqok response.json就能直接看到结果。它帮我省掉了重复输入同一串过滤器的麻烦也让“只留一个工具”这件事变得真正可落地。另一个习惯是把常用的复杂过滤器写进一个.jq文件里用jq -f filter.jq data.json调用需要修改时只改文件不改命令逻辑可以复用。改完收藏夹之后我现在处理 JSON 相关的事情基本不再打开浏览器找工具了。最初还担心命令行工具会麻烦实际用下来反而更干净利落。如果你也在收藏夹里躺着一堆 JSON 工具我建议你先试着用 jq 跑通一次格式化、校验、提取的流程大概率会和我一样再也不想打开那些在线网站了。