
oh-my-zsh jsontools 插件实战指南命令行 JSON 格式化、校验与 URL 编解码【免费下载链接】ohmyzsh A delightful community-driven (with 2,500 contributors) framework for managing your zsh configuration. Includes 300 optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, python, etc), 140 themes to spice up your morning, and an auto-update tool that makes it easy to keep up with the latest updates from the community.项目地址: https://gitcode.com/gh_mirrors/oh/ohmyzshjsontools 是 oh-my-zsh 官方插件库中专门用于命令行处理 JSON 数据的轻量工具集通过管道即可完成 JSON 美化输出pretty print、合法性校验、URL 编码与解码并原生支持 NDJSON换行分隔 JSON流式处理。读完本文你将掌握 jsontools 的启用方式、四个核心命令与对应 NDJSON 变体的用法并能结合源码理解其基于 node / python3 / ruby 的多后端解析原理、退出码约定与自定义解析器方法。插件启用与加载机制jsontools 插件本身是纯 zsh 脚本无需编译安装。要启用它只需在你的.zshrc配置文件的plugins数组中追加jsontools即可plugins(... jsontools)这与 oh-my-zsh 的标准插件加载流程一致.zshrc中声明的插件名会被 oh-my-zsh 启动脚本依次 sourceoh-my-zsh.sh 中的加载循环会执行for plugin ($plugins); do _omz_source plugins/$plugin/$plugin.plugin.zsh done也就是说jsontools对应的入口文件是 jsontools.plugin.zsh它与官方 README 同处plugins/jsontools/目录。插件加载完成后pp_json、is_json、urlencode_json、urldecode_json及各自的ndjson变体函数即成为当前 shell 会话中可用的命令。运行环境要求后端解析器探测逻辑jsontools 本身不实现 JSON 解析器而是依赖外部工具完成实际解析。插件按以下优先级探测系统中可用的后端nodepython3ruby这些工具中至少有一个必须位于$PATH中并且在插件被加载之前就已经可用否则插件会提前退出上述函数将全部不可用。从 jsontools.plugin.zsh 的源码可以还原这套探测逻辑的完整细节# 若用户已显式指定 JSONTOOLS_METHOD则验证该命令是否存在不存在则清除 if [[ -n $JSONTOOLS_METHOD ]]; then (( $commands[$JSONTOOLS_METHOD] )) || unset JSONTOOLS_METHOD fi # 未指定时按 node - python3 - ruby 顺序查找第一个已安装的命令 if [[ -z $JSONTOOLS_METHOD ]]; then for JSONTOOLS_METHOD in node python3 ruby; do (( $commands[$JSONTOOLS_METHOD] )) break unset JSONTOOLS_METHOD done # 三个都不可用时直接退出插件不定义任何函数 [[ -n $JSONTOOLS_METHOD ]] || return 1 fi这里有两个值得注意的机制自定义后端你可以通过环境变量JSONTOOLS_METHOD强制指定解析器如JSONTOOLS_METHODpython3插件会先用$commands[...]检测该命令是否真实存在不存在则自动回退到自动探测流程失败即退出若node、python3、ruby全部缺失插件会以return 1提前结束加载本次 shell 会话中将没有任何 jsontools 命令可用。确定解析器后变量会被unset见 jsontools.plugin.zsh不会污染全局环境。四个核心命令插件的用法非常直观把 JSON 数据通过管道传给对应的 jsontool 即可。共提供四个基础命令命令功能pp_json美化打印pretty printJSONis_json校验输入是否为合法 JSON合法输出true非法输出false并返回对应的退出码urlencode_json对给定 JSON 做 URL 编码输出编码后的字符串urldecode_json对给定的 URL 编码字符串做解码还原出 JSON支持 NDJSON换行分隔 JSON插件同时支持 NDJSON 输入。所谓 NDJSON是指文件中每一行都是独立、完整的 JSON 对象行与行之间以换行符分隔。所有基础命令都有一个逐行读取、逐行处理的替代版本命名规则是把命令中的json替换为ndjsonpp_ndjson、is_ndjson、urlencode_ndjson、urldecode_ndjson从源码看这组 NDJSON 函数并非为每个后端单独实现而是由 jsontools.plugin.zsh 末尾的一个统一封装统一生成function {pp,is,urlencode,urldecode}_ndjson() { local json jsonfunc${0//ndjson/json} while read -r json; do $jsonfunc $json done }其原理是利用 zsh 的花括号展开一次定义四个同名函数函数内部通过${0//ndjson/json}把当前函数名中的ndjson替换成json从而得到对应的基础命令名如pp_ndjson内部调用pp_json然后用while read -r逐行读取标准输入每读到一行 JSON 就调用一次基础命令。因此 NDJSON 版本天然继承了所选后端的全部行为且对超长流式输入友好——可以边读边处理不必等全部数据载入内存。完整示例以下示例均来自插件官方 README可直接在启用插件后复制执行。pp_json抓取远端 JSON 并美化输出# 将 curl 得到的 json 数据美化打印 $ curl https://coderwall.com/bobwilliams.json | pp_jsonis_json校验文件内容是否为合法 JSON# 校验 data.json 的内容是否符合 JSON 规范 $ is_json data.json true # 输出 true / false并返回对应的退出码 $ echo $? 0urlencode_json直接编码命令行传入的 JSON# 从命令行直接传入 json 数据 $ echo {b:2, a:1} | urlencode_json %7B%22b%22:2,%20%22a%22:1%7Durldecode_json解码 URL 编码字符串# 待解码的 url 编码字符串 $ echo %7B%22b%22:2,%20%22a%22:1%7D | urldecode_json {b:2, a:1}pp_ndjson批量美化多个 JSON 对象# echo 两个独立的 json 对象并分别美化打印 $ echo {a: b}\n{c: [1,2,3]} | pp_ndjson { a: b } { c: [ 1, 2, 3 ] }源码级实现解析三种后端的差异与细节同一组命令在不同后端下由不同的底层调用实现行为上存在细微差异。以下分别说明 jsontools.plugin.zsh 中case $JSONTOOLS_METHOD的三个分支。node 分支node 不擅长直接读取 stdin因此插件通过xargs -0把以 NUL 分隔的管道输入作为参数传给 node 脚本function pp_json() { xargs -0 node -e console.log(JSON.stringify(JSON.parse(process.argv[1]), null, 4)); }pp_jsonJSON.parse解析后以 4 空格缩进序列化输出is_jsontry/catch包裹JSON.parse成功打印true并process.exit(0)失败打印false并process.exit(1)urlencode_json/urldecode_json分别调用encodeURIComponent与decodeURIComponent。python3 分支python3 分支直接复用标准库未使用第三方依赖function pp_json() { python3 -c import sys; del sys.path[0]; import runpy; runpy._run_module_as_main(json.tool) }pp_json通过runpy以模块方式运行标准库json.tool效果等价于python3 -m json.toolis_jsonjson.loads(sys.stdin.read())解析成功打印true并sys.exit(0)捕获ValueError打印false并sys.exit(1)urlencode_json/urldecode_json使用urllib.parse的quote_plus与unquote_plus。注意脚本开头统一执行del sys.path[0]用于移除-c模式默认注入的当前路径避免影响标准库导入。ruby 分支ruby 分支同样只用标准库json、yaml、cgifunction pp_json() { ruby -e require json require yaml puts JSON.parse(STDIN.read).to_yaml }pp_json解析 JSON 后调用to_yaml输出——也就是说在 ruby 后端下pp_json的输出实际上是 YAML 格式而不是 JSON 缩进格式这是与 node / python3 后端最明显的行为差异is_jsonJSON.parse成功打印true并exit(0)捕获JSON::ParserError打印false并exit(1)urlencode_json/urldecode_json基于CGI.escape/CGI.unescape。三个后端的行为差异小结从上述源码可以总结出几个需要留意的细节退出码约定一致无论哪个后端is_json对合法 JSON 统一返回0对非法 JSON 统一返回非零1因此该命令可直接用于 shell 脚本条件判断URL 编码的空白字符处理不同node 的encodeURIComponent将空格编码为%20而 python3 的quote_plus与 ruby 的CGI.escape将空格编码为。若你的 JSON 中含空格且对编码结果有强一致要求可通过JSONTOOLS_METHOD固定后端美化输出的格式差异node / python3 输出 4 空格缩进的 JSONruby 后端输出 YAML。若需要跨机器保持一致的美化效果建议显式固定JSONTOOLS_METHOD。自定义解析器方法如果你想强制使用某个后端例如机器上同时装有 node 与 python3但希望统一走 python3只需在加载插件前导出环境变量export JSONTOOLS_METHODpython3插件加载时会先校验JSONTOOLS_METHOD指向的命令是否存在若不存在则回退到自动探测。该变量在探测完成后会被主动 unset不会残留在环境中影响其他程序。常见问题与使用提示所有函数都不可用说明node、python3、ruby均不在$PATH中或它们在插件加载之后才被安装。请在安装任一运行时后重新打开 shell 或重新 source 配置。is_json的输出与退出码不一致is_json是「输出 退出码」双通道设计合法时打印true且$?为0非法时打印false且$?为1既适合人眼观察也适合脚本断言。想要美化超大 JSON 文件直接用pp_json huge.json或cat huge.json | pp_json即可若文件是每行一个对象的 NDJSON 格式则改用pp_ndjson逐行处理避免一次性把全部内容读入内存。处理带空格的 JSON 时 URL 编码结果不同这是后端实现差异所致%20vs通过JSONTOOLS_METHOD固定后端即可获得确定性输出。需要动手验证或查看完整实现时可直接阅读本插件的 插件源码 与 官方 README其中 README 还提供了全部命令的官方示例供对照练习。【免费下载链接】ohmyzsh A delightful community-driven (with 2,500 contributors) framework for managing your zsh configuration. Includes 300 optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, python, etc), 140 themes to spice up your morning, and an auto-update tool that makes it easy to keep up with the latest updates from the community.项目地址: https://gitcode.com/gh_mirrors/oh/ohmyzsh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考