调试接口或查看日志时,经常会复制一段没有换行的 JSON。手动整理既慢又容易看错,其实可以让 jq 直接完成格式化,再把结果写回剪贴板。
这篇文章参考了 Using jq to format JSON on the clipboard,并整理成 macOS 和 Linux 下可以直接使用的命令。
macOS
macOS 自带 pbpaste 和 pbcopy,分别用于读取和写入剪贴板:
pbpaste | jq '.' | pbcopy
为了以后直接使用,可以把它加到 ~/.zshrc:
alias jsontidy="pbpaste | jq '.' | pbcopy"
重新打开终端,或者执行:
source ~/.zshrc
之后复制 JSON,运行:
jsontidy
jq '.' 中的 . 表示输出当前 JSON 值。jq 在解析它的同时会默认使用缩进和换行进行 pretty print。
Linux
Linux 可以使用 xclip 读写 X11 剪贴板:
xclip -selection clipboard -o | jq '.' | xclip -selection clipboard
其中:
-o表示从剪贴板输出内容;- 最后一个
xclip -selection clipboard从标准输入读取内容并写回剪贴板。
同样可以配置一个别名:
alias jsontidy="xclip -selection clipboard -o | jq '.' | xclip -selection clipboard"
不要让无效 JSON 清空剪贴板
上面的命令有一个容易忽略的问题:如果剪贴板内容不是合法 JSON,jq 会报错并且不输出结果,但最后的 xclip 仍然会执行。这样原来的剪贴板内容就可能被空内容覆盖。
可以在 jq 失败时重新读取原剪贴板内容:
alias jsontidy="xclip -selection clipboard -o | (jq '.' || xclip -selection clipboard -o) | xclip -selection clipboard"
这条命令的行为是:
- 先读取剪贴板;
- JSON 合法时,写入
jq格式化后的结果; - JSON 无效时,重新读取原内容并原样写回。
macOS 也可以使用同样的思路:
alias jsontidy="pbpaste | (jq '.' || pbpaste) | pbcopy"
这样既能快速整理 JSON,也不会因为误复制了普通文本而丢失剪贴板内容。