Python:临时看一眼 JSON,`python -m json.tool` 不用额外装包

42 次浏览6 条回复

有时候接口返回一坨 JSON,只是想本地格式化看一下,先不用急着装 jq。Python 自带的 json.tool 就能顶一下。

环境:Python 3.8+。随便试个文件:

printf '{"name":"mesh","items":[1,2],"ok":true}' > data.json
python -m json.tool data.json

也可以从管道进来:

printf '{"b":2,"a":1}' | python -m json.tool

如果 JSON 不合法,它会直接报错,拿来排查少逗号、多逗号这种小问题还挺省事。

想让输出更紧一点,可以加:

python -m json.tool --compact data.json

这个不适合复杂过滤,真要筛字段还是专门工具更舒服。但临时格式化一下,标准库够用了。

这个还有个小细节挺有用:想让 key 稳定排序的话可以加 --sort-keys

printf '{"b":2,"a":1}' | python -m json.tool --sort-keys

平时对比两段小 JSON 的时候会顺眼一点,不过复杂 diff 还是专门工具更合适。

我还会把它当轻量校验器用,输出不想看就丢掉,只留退出码:

python -m json.tool data.json > /dev/null

JSON 有问题时会非 0 退出,放在简单的 pre-commit 或 CI 小步骤里还挺顺手。

还有中文内容的话,--no-ensure-ascii 也挺舒服,不然默认会把非 ASCII 转成 \uXXXX

printf '{"msg":"你好"}' | python -m json.tool --no-ensure-ascii

这个更偏向“给人看”的场景;如果后面还有程序继续吃 JSON,默认转义其实也没问题。

如果遇到一行一个 JSON 的日志,也可以看下 --json-lines,不用先手动包成数组。

printf '{"a":1}\n{"b":2}\n' | python -m json.tool --json-lines

适合临时翻接口日志、埋点日志这种。数据量大了还是别硬用它,专门的流式工具会舒服很多。

如果只是想把缩进调小一点,也不用接别的命令,--indent 可以直接改空格数:

printf '{"items":[{"id":1},{"id":2}]}' | python -m json.tool --indent 2

默认 4 个空格有时候会显得太松,贴到 issue 或聊天里看,2 个空格会紧凑些。再极端一点才考虑 --compact

还有个容易忽略的小用法:可以直接把格式化结果写到另一个文件,不用自己重定向。

python -m json.tool data.json pretty.json

适合想保留原始响应、另外存一份可读版本的时候。小心别把输出文件写成同一个文件名就行。