Bash JSON 查看器 — jless、JQ_COLORS 与终端指南

·Platform Engineer·审阅者Nadia Okonkwo·发布日期

直接在浏览器中使用免费的 JSON Pretty Print,无需安装。

在线试用 JSON Pretty Print →

当你需要一个用于交互式探索而非脚本编写的 bash JSON 查看器时,标准的 jq . 管道远远不够——输出会滚过终端顶部,面对 300 行的 API 响应你无法向上导航。本指南介绍专为 在终端中交互式查看 JSON 而构建的工具: jless(带 vim 键位导航的可折叠树形视图)、 JQ_COLORS 自定义颜色主题、 jq -C | less -R 带颜色分页、 日常使用的 shell 别名,以及 fx 作为 Node.js 替代方案。 关于脚本编写、CI/CD 和验证工作流,请参阅配套的 在 Bash 中格式化 JSON 指南。零安装的浏览器查看器, JSON Pretty Print 工具可即时使用。示例已在 Bash 5.x(macOS 通过 Homebrew,Ubuntu 22.04+)上测试,兼容 Bash 3.2+(macOS 系统 shell)。

核心要点
  • jless — 终端中最佳交互式 JSON 查看器:可折叠树形视图、vim 键位、增量搜索
  • jq -C . | less -R — 带颜色的可滚动分页器,除 jq 外无需额外安装
  • JQ_COLORS — 为每种 JSON 类型自定义 jq ANSI 颜色方案的环境变量
  • fx — 支持鼠标操作和 JavaScript 过滤表达式的交互式 Node.js JSON 查看器
  • alias jv='jless' — 单词命令让交互式查看成为肌肉记忆习惯

交互式查看与脚本化查看 JSON 的区别

当你需要格式化小型 payload 的输出,或将结果传递给另一个命令时,将 JSON 管道传输到 jq . 是正确选择。但当你需要探索一个包含 200 个字段的 API 响应时,这就不合适了——输出会飞速滑过终端窗口,你无法导航、折叠部分,也无法在不重新运行带过滤器的命令的情况下搜索特定字段。交互式 JSON 查看器在持久化分页器中渲染相同的格式化、着色输出,由你控制导航。数据完全相同;区别在于界面。

Before · Bash
After · Bash
# jq . — 大型响应的输出会滚出屏幕
curl -s https://api.github.com/users/torvalds | jq .
# 300+ 行滚过——你立即失去上下文
# jless — 打开交互式分页器,没有内容滚出屏幕
curl -s https://api.github.com/users/torvalds | jless
# 完整文档可见,可折叠,可用 j/k/h/l 搜索
注意:交互式查看器仅供人工检查——它们不应出现在脚本、CI 流水线或自动化中。对于程序化 JSON 处理,请使用带有显式过滤器和退出码处理的 jq 在 Bash 中格式化 JSON 指南涵盖了这些脚本模式。

jless — 交互式 JSON 查看器

jless 是一个专为终端设计的 JSON 查看器。与普通的 jq 管道不同,它将文档渲染为持久化可折叠树:每个对象和数组都可以用 l h 独立展开或折叠,导航使用 vim 风格键位,增量搜索可即时找到任何键或值。它以流式方式增量处理输入,无论文件大小如何,都能在一秒内打开大文件和 API 响应——而 jq 在显示任何内容之前会缓冲整个文档。每当 API 响应大到无法一眼扫完,我都会第一时间使用 jless。

安装

Bash
# macOS
brew install jless

# Linux — 从 GitHub Releases 下载预构建二进制文件
curl -sL https://github.com/PaulJuliusMartinez/jless/releases/latest/download/jless-x86_64-unknown-linux-gnu.tar.gz \
  | tar xz
sudo mv jless /usr/local/bin/

# 验证
jless --version

基本用法

Bash
# 打开本地文件——交互式树形查看器立即启动
jless api-response.json

# 将任意 JSON 流直接管道传入 jless
curl -s https://api.github.com/users/torvalds | jless

# 以所有节点折叠到顶层的方式打开(大型文档的实用起点)
jless --mode line api-response.json

# 加载特定数组元素并单独查看
jq '.[0]' deployments.json | jless

实际导航与搜索

Bash
# 在 jless 内部:
#
#   j / ↓        向下移动
#   k / ↑        向上移动
#   l / →        展开节点(或 Enter)
#   h / ←        折叠节点
#   H            折叠当前节点及所有同级节点 → 高层概览
#   L            递归展开所有内容
#
#   /            开始向前搜索——输入键名后按 Enter
#   n / N        下一个 / 上一个搜索结果
#
#   g / gg       跳转到开头
#   G            跳转到末尾
#   q            退出

jless 键盘快捷键参考

打开 jless 后所有快捷键立即可用——无需任何配置。导航模型与 vim 完全相同,现有的肌肉记忆可直接迁移。

按键
操作
使用场景
j / ↓
光标下移一行
浏览对象键或数组元素
k / ↑
光标上移一行
返回上一个字段
J
向下移动 5 行
快速滚动长数组
K
向上移动 5 行
快速向上导航
h / ← / -
折叠当前节点
隐藏大型嵌套对象以减少干扰
l / → / +
展开当前节点
打开已折叠的对象或数组
H
折叠当前节点及所有同级节点
获取结构的顶层概览
L
递归展开所有节点
显示嵌套结构的完整深度
g
跳转到文档开头
快速返回根节点
G
跳转到文档末尾
跳转到大数组的最后一个元素
/
开始向前搜索
在文档中查找特定键或值
?
开始向后搜索
从当前位置向上搜索
n
跳转到下一个搜索结果
循环浏览搜索词的所有匹配项
N
跳转到上一个搜索结果
向后逐步浏览搜索结果
q
退出 jless
检查完成后退出

jq -C | less -R — 无需额外工具的带颜色分页

如果未安装 jless 但需要可滚动的带颜色 JSON 视图, jq -C . | less -R 是一个称职的备用方案。-C 标志即使在 stdout 是管道时也强制输出 ANSI 颜色码(通常 jq 会去除颜色), -R 告诉 less 渲染这些颜色码而不是将其打印为字面文本。结果是一个完全着色、可滚动的文档——但没有 jless 的交互式树形结构。less 内部导航使用方向键或 vim 风格的 j/k / 触发 less 的内置文本搜索。

Bash
# 基本带颜色分页
jq -C . response.json | less -R

# 从 curl 响应——-s 防止进度条干扰 JSON 流
curl -s https://api.github.com/repos/jqlang/jq | jq -C . | less -R

# 键名排序后分页,便于视觉扫描
jq -CS . config.json | less -R
# -C = 强制颜色,-S = 键名排序(两个标志合并使用)

# 添加别名,不再需要每次输入完整管道命令
alias jqv='jq -C . | less -R'
# 用法:cat response.json | jqv
#    或:curl -s https://api.example.com/status | jqv
注意:jq -C | less -R 会在 less 可以显示内容之前缓冲所有格式化输出。对于 200 MB 的文件,这意味着需要等待数秒并消耗大量内存——与普通 jq . 有相同的限制。对于大文件,请使用 jless,它支持流式增量处理。

JQ_COLORS — 自定义颜色主题

JQ_COLORS 是一个覆盖 jq 默认 ANSI 颜色方案的环境变量。它接受一个以冒号分隔的七个 ANSI 属性和颜色码字符串,按此固定顺序每种 JSON 类型各一个:null : false : true : 数字 : 字符串 : 数组 : 对象。每个码的格式为 属性;颜色,其中属性为 0(正常)、 1(粗体)、 2(暗淡)或 4(下划线),颜色为标准 ANSI 颜色数字(30–37 = 标准色,90–97 = 亮色)。

Bash
# 构建 JQ_COLORS 的 ANSI 颜色参考:
#   属性:  0=正常  1=粗体  2=暗淡  4=下划线
#   颜色:  30=黑色  31=红色  32=绿色  33=黄色
#           34=蓝色  35=品红  36=青色  37=白色
#   亮色:  90=亮黑  91=亮红  92=亮绿  93=亮黄
#           94=亮蓝  95=亮品红  96=亮青  97=亮白
#
# 顺序:null : false : true : 数字 : 字符串 : 数组 : 对象

# 深色终端高对比度主题(推荐)
export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96:1;96"
# null=暗灰色, false=亮红色, true=亮绿色,
# numbers=亮黄色, strings=绿色, arrays=粗体青色, objects=粗体青色

# Solarized 风格主题
export JQ_COLORS="2;37:0;35:0;35:0;36:0;33:1;34:1;34"
# null=暗白色, false=品红, true=品红,
# numbers=青色, strings=黄色, arrays=粗体蓝色, objects=粗体蓝色

# 极简风格(仅键名加粗,其余全部普通)
export JQ_COLORS="0;90:0;39:0;39:0;39:0;39:1;39:1;39"
Bash
# 将选择的主题添加到 ~/.bashrc 或 ~/.zshrc,使其应用于每次 jq 调用
echo 'export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96:1;96"' >> ~/.bashrc
source ~/.bashrc

# 测试主题
echo '{"active":true,"errors":null,"count":42,"tags":["api","v2"],"meta":{"version":"1.0"}}' | jq .
警告:JQ_COLORS 必须恰好包含七个以冒号分隔的值。如果字符串的段数不足,jq 会静默回退到内置默认值,不会显示任何错误信息——这使得配置错误难以诊断。在将新颜色字符串添加到 shell 配置文件之前,务必在简短的 JSON payload 上测试。

日常 JSON 查看的 Shell 别名

交互式 JSON 查看的命令默认较为冗长。在 ~/.bashrc ~/.zshrc 中设置一小组别名,可将 jless 和带颜色分页变成单词命令,自然地融入任何工作流程。以下别名可以组合使用—— jv jvp 都接受管道输入或文件名作为第一个参数。

Bash
# 添加到 ~/.bashrc 或 ~/.zshrc

# jv — 交互式查看器(优先使用 jless,备用带颜色分页)
jv() {
  if command -v jless &>/dev/null; then
    jless "$@"
  else
    jq -C . "$@" | less -R
  fi
}

# jvp — 按字母顺序排序键后查看(适合比较响应)
alias jvp='jq -CS . | less -R'

# jvc — 从剪贴板查看(macOS)
alias jvc='pbpaste | jless'

# jvf — 查看并过滤:jvf '.users[0]' response.json
jvf() {
  local filter="$1"; shift
  jq -C "$filter" "$@" | less -R
}

# 无需重启终端即可重新加载
source ~/.bashrc
Bash
# 添加上述别名后的使用示例

# 查看任意文件或管道响应
jv deployment-config.json
curl -s https://api.github.com/users/torvalds | jv

# 排序后查看(按字母顺序便于扫描)
cat feature-flags.json | jvp

# 交互式深入子文档
jvf '.database' infra/app-config.json
jvf '.users[] | select(.role == "admin")' users.json

bat — 带语法高亮的 JSON 文件查看

bat cat 的替代品,带有语法高亮、行号和内置分页器。对于磁盘上的 JSON 文件,它提供了简洁的编辑器风格阅读体验,无需打开完整的文本编辑器。与 jless 不同,bat 将文件渲染为静态文本——没有折叠、没有搜索、没有超出滚动的导航。它的优势在于中等大小静态文件(配置、测试固件、测试 payload)的视觉清晰度,当你需要语法颜色和行号但不需要交互式树形导航时。

Bash
# macOS
brew install bat

# Debian / Ubuntu(二进制文件可能命名为 batcat)
apt-get install -y bat
# alias bat=batcat   # 如果 Ubuntu 上需要,添加到 ~/.bashrc

# 以语法高亮和行号查看 JSON 文件
bat config/feature-flags.json

# 禁用分页——直接打印到终端(脚本中有用)
bat --paging=never api-response.json

# 与 jq 结合:用 jq 格式化,用 bat 查看(保留 bat 的 JSON 高亮)
jq '.' response.json | bat --language=json --paging=never
注意:使用 bat 查看行号重要的静态配置文件和测试固件(例如,当测试失败引用固件文件第 47 行时)。对于来自 curl 的 API 响应和动态 JSON,jless 打开更快,导航更实用。如果需要在浏览器中查看并与同事分享,直接粘贴到 JSON Pretty Print 工具中——无需终端。

fx — 交互式 Node.js JSON 探索器

fx 是一个基于 Node.js 构建的交互式 JSON 查看器。其界面与 jless 类似——可折叠树形视图、键盘导航、搜索——但它增加了两个 jless 所没有的功能:鼠标支持(点击展开/折叠节点)和在底部栏输入 JavaScript 表达式实时过滤文档的能力。对于已经运行 Node.js 的团队,fx 是自然之选,无需单独安装二进制文件。对于没有 Node 的纯终端环境,jless 是更轻量的选择。

Bash
# 通过 npm 全局安装
npm install -g fx

# 或无需安装直接运行(npx 缓存包)
curl -s https://api.github.com/users/torvalds | npx fx

# 基本交互式使用
fx api-response.json
curl -s https://api.github.com/repos/jqlang/jq | fx

# 在 fx 中:方向键导航,Enter 展开/折叠,/ 搜索
# 底部栏接受 JavaScript 表达式进行实时过滤:
#   .name           → 仅显示 "name" 字段
#   .repos.slice(0,5) → 前 5 个仓库
Bash
# fx 也可用作非交互式格式化器(类似 jq . 但使用 JS 语法)
# 将 JavaScript 表达式作为参数传入——无交互模式
echo '{"users":[{"id":1,"name":"Sarah Chen"},{"id":2,"name":"Marcus Osei"}]}' \
  | fx '.users[0].name'
# Sarah Chen

# 链式 map 进行数组转换
cat deployments.json | fx '.items.map(d => ({id: d.deploy_id, status: d.state}))'

常见错误

这四个错误在开发者初次使用终端 JSON 查看器时反复出现——一旦理解原因,每个错误都有明确的解决方法。

用 jq . 查看大型响应(输出滚出屏幕)

问题: jq . 一次性将所有输出转储到标准输出。对于长度超过终端高度的响应,最后一屏以上的所有内容都会消失——你无法滚动回开头,也无法在不重新运行带过滤器的命令的情况下导航到特定字段。

解决: 使用 jless 进行交互式导航,或使用 jq -C . | less -R 作为备用方案。无论文档大小如何,两者都能保持完整文档的可访问性。

Before · Bash
After · Bash
# 300 行 API 响应——前 280 行立即滚出屏幕
curl -s https://api.github.com/users/torvalds | jq .
# 只有输出底部可见——无法向上导航
# 完整文档在 jless 中始终可访问——不会丢失任何内容
curl -s https://api.github.com/users/torvalds | jless
# j/k 滚动,h/l 折叠/展开,/ 搜索
设置 JQ_COLORS 时段数错误

问题: JQ_COLORS 需要恰好七个以冒号分隔的值。如果字符串有六个或八个值,jq 会静默忽略整个变量并回退到编译内置的默认值——没有警告,没有错误,只是显示错误的颜色。

解决: 计算冒号数:有效的 JQ_COLORS 字符串恰好有六个冒号和七个值。将变量通过 echo 输出并用 tr 计数。

Before · Bash
After · Bash
# 只有 6 个值——jq 静默使用默认值,没有任何提示
export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96"
echo '{"ok":true}' | jq .  # 颜色未变——没有显示错误
# 恰好 7 个值——6 个冒号
export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96:1;96"

# 添加到 shell 配置文件之前验证数量
echo "$JQ_COLORS" | tr -cd ':' | wc -c   # 必须输出 6
将 jless 或 fx 的输出管道传入另一个命令

问题: jless 和 fx 将其交互界面渲染到终端(TTY),而不是标准输出。将它们管道传入 grep、tee 或任何其他命令会产生乱码的 ANSI 转义码或空输出——查看器的交互式输出并非设计为被其他程序消费。

解决: 使用带有显式过滤器的 jq 以程序化方式提取数据。仅在人工阅读输出时,将 jless 和 fx 用作管道中的最后一步。

Before · Bash
After · Bash
# jless 输出是给人看的——管道传入会产生乱码
jless response.json | grep "request_id"
# 输出:ANSI 转义码和光标序列,而非干净文本
# 使用 jq 进行程序化提取——干净、可组合
jq -r '.request_id' response.json | grep "req_"

# 仅将 jless 作为终端端点使用——其后无任何命令
jless response.json
使用 jq -C 而不搭配 less -R(颜色码打印为字面文本)

问题: -C 将 ANSI 颜色码强制输出到输出流。当该流直接打印到非原始模式的终端——或管道传入不解释 ANSI 的工具时——转义序列会显示为字面字符,如 ^[[1;34m,污染输出。

解决: 始终将 jq -C 与 less -R 配对使用。-R 标志将 less 置于原始输入模式,告诉它将 ANSI 序列渲染为颜色而不是打印为文本。

Before · Bash
After · Bash
# -C 不加 -R:转义序列打印为原始文本
jq -C . response.json | less
# 输出:^[[1;34m"status"^[[0m: ^[[0;32m"ok"^[[0m ...
# -C 搭配 -R:ANSI 码渲染为实际颜色
jq -C . response.json | less -R
# 输出:带颜色的 JSON,干净易读

jless vs jq vs bat vs fx — 交互式查看器比较

四种工具都能渲染带颜色的 JSON,但交互能力差异显著。根据是否需要可折叠导航、搜索或鼠标支持来选择——以及你的环境中是否已有 Node.js。

工具
交互导航
搜索
可折叠
颜色
大文件
安装
jless
✅ vim 键位
✅ (/, n, N)
✅ (h/l 键)
✅ (内置)
✅ (流式)
brew / 二进制
jq -C | less -R
⚠️ (仅 less)
✅ (less 中的 /)
✅ (ANSI)
⚠️ (全部缓冲)
仅需 jq
fx
✅ 方向键
✅ (/)
⚠️ (JS 加载)
npm install -g fx
bat
⚠️ (仅分页)
❌ (bat 内不支持)
✅ (主题)
⚠️ (全部读取)
brew / apt
jq . (纯输出)
❌ (滚出屏幕)
✅ (仅 tty)
brew / apt

大多数情况下:安装一次 jless 并将其作为默认交互式查看器使用。在无法安装额外二进制文件的环境中,保留 jq -C . | less -R 作为备用方案。如果你的团队以 Node.js 为主且重视鼠标导航或实时 JavaScript 过滤,则添加 fx。

常见问题

如何在终端中搜索 JSON 文件里的特定键?

在 jless 中,按 / 打开增量搜索提示符,输入键名,然后按 Enter。使用 n 向前跳转匹配项,N 向后跳转。搜索默认区分大小写。在 jq -C | less -R 中,/ 触发 less 的内置搜索,会匹配包含 ANSI 颜色码的原始文本——jless 搜索对结构化 JSON 更可靠。

Bash
# 用 jless 打开文件,然后按 / 搜索
jless api-response.json
# 在 jless 中:输入 /  →  "request_id"  →  Enter  →  n 跳转下一个匹配

# jq 替代方案:提取并打印所有匹配的键到标准输出
jq '.. | objects | with_entries(select(.key == "request_id"))' api-response.json

如何用键盘快捷键导航深层嵌套的 JSON 结构?

jless 采用 vim 导航模式:j/k 上下移动,h 折叠节点,l 展开节点。按 H 可以一次性折叠当前节点及所有同级节点——在深入某个特定分支之前获取高层概览时非常有用。L 可递归展开所有内容。将所有内容折叠到顶层后,用 l 仅展开你关注的路径。

Bash
# 用 jless 打开响应
curl -s https://api.github.com/repos/jqlang/jq | jless
# 在 jless 中:
#   H            → 折叠所有顶层键
#   j/k          → 导航到目标键
#   l            → 仅展开该分支
#   gg           → 返回根节点
#   G            → 跳转到最后一个元素

如何让 jq 的颜色输出在深色终端下更易阅读?

为每种 JSON 类型设置带有 ANSI 属性和颜色码的 JQ_COLORS 环境变量。七个位置依次对应:null、false、true、数字、字符串、数组、对象。将 export 语句放入 ~/.bashrc 或 ~/.zshrc,使其应用于每次 jq 调用。深色背景下使用粗体亮色效果最佳。

Bash
# 深色终端高对比度主题——添加到 ~/.bashrc 或 ~/.zshrc
export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96:1;96"
# null=灰色, false=亮红色, true=亮绿色,
# numbers=亮黄色, strings=绿色, arrays/objects=亮青色

# 无需重载 shell,立即测试
echo '{"active":true,"errors":0,"tags":["api","v2"]}' | jq .

jless 和 jq . 查看 JSON 有什么区别?

jq . 会将输出一次性滚动过终端顶部,无法向上导航——适合小型响应,但对于超过 50 行的内容则不切实际。jless 在交互式分页器中渲染整个文档,可以滚动、搜索、折叠节点,并使用键盘快捷键导航而不会丢失上下文。查看小型 payload 时使用 jq .;需要探索复杂结构时使用 jless。

Bash
# 小型 payload——jq . 完全够用
echo '{"status":"ok","version":"2.4.1"}' | jq .

# 大型或嵌套响应——jless 更佳
curl -s https://api.github.com/repos/jqlang/jq | jless
# → 交互式树形视图,没有输出被滚出屏幕

如何在终端中交互式查看 curl 响应的 JSON?

将 curl 直接管道传输到 jless。始终加上 -s(静默模式)防止 curl 的进度条出现在输出中。jless 会以可折叠树的形式打开交互式查看器显示完整响应。如果未安装 jless,jq -C . | less -R 可作为备用方案提供带颜色的分页视图。

Bash
# 使用 jless 进行交互式探索
curl -s https://api.github.com/users/torvalds | jless

# 带颜色的分页备用方案(无折叠,但可滚动查看颜色)
curl -s https://api.github.com/users/torvalds | jq -C . | less -R

能否在终端中并排查看多个 JSON 文件?

jless 每次只能打开一个文件。如需并排比较,可使用终端复用器:tmux split-window -h 打开垂直分割,然后在每个面板中用不同文件运行 jless。如果需要结构性比较两个文档,也可以使用浏览器端的 JSON Diff 工具。

Bash
# tmux 并排:水平分割,然后在每个面板运行 jless
tmux split-window -h
# 左面板:  jless response-v1.json
# 右面板:  jless response-v2.json

# 或对 jq 规范化后的输出使用 diff 进行文本比较
diff <(jq -S . response-v1.json) <(jq -S . response-v2.json)

相关工具

JSON Pretty Print 工具为你提供与 jless 相同的可折叠、带颜色视图——直接在浏览器中,无需安装,无需终端。

CM
Cora MatsumotoPlatform Engineer

Cora is a platform engineer who builds developer tooling and internal platforms, using Bash as the glue that connects components written in different languages and runtimes. She writes about cross-platform shell scripting, Bash utility functions, environment management, configuration templating, and the practical shell techniques that platform engineers use to build self-service tooling for development teams.

NO
Nadia Okonkwo技术审阅者

Nadia is a site reliability engineer who lives in the terminal. She writes Bash scripts that process logs, transform data, and orchestrate infrastructure across fleets of servers. She is a heavy user of jq, awk, and sed and writes about shell one-liners, text processing pipelines, data serialisation from the command line, and the practical Bash patterns that SREs reach for when speed matters more than elegance.