如何在Shell脚本及Bash控制台中压缩JSON?
在Bash控制台压缩JSON的实用方法
我刚好也经常遇到这种需求——把带空格换行的JSON压缩成紧凑格式,方便直接内联传给httpie这类工具用!下面给你几个亲测好用的方法:
方法1:用jq(最推荐,功能强大)
jq是Linux/macOS下处理JSON的神器,几乎所有发行版都能通过包管理器安装(比如apt install jq或者brew install jq)。压缩JSON的命令超简单:
如果是处理文件:
jq -c '.' input.json
如果是直接管道输入(比如你给出的示例):
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq -c '.'
这里的-c参数就是「compact(紧凑)输出」的意思,刚好能输出你要的{"foo":"lorem","bar":"ipsum"}格式。
顺便提下你提到的格式化输出对应操作,只要去掉-c就行:
echo '{"foo":"lorem","bar":"ipsum"}' | jq '.'
方法2:用Python(无需额外安装,系统自带)
大多数系统都自带Python,所以这个方法不用额外装工具,很方便:
Python 3.9+ 版本
可以直接用--compact参数:
echo '{ "foo": "lorem", "bar": "ipsum" }' | python -m json.tool --compact
兼容所有Python版本的写法
如果你的Python版本比较旧,用这个更稳妥:
echo '{ "foo": "lorem", "bar": "ipsum" }' | python -c "import json, sys; print(json.dumps(json.load(sys.stdin), separators=(',',':')))"
通过separators=(',',':')直接指定分隔符去掉空格,完美生成紧凑JSON。
反向格式化同样用python -m json.tool就行:
echo '{"foo":"lorem","bar":"ipsum"}' | python -m json.tool
方法3:用Node.js(如果你的环境装了Node)
如果平时用Node开发,这个方法也很顺手:
echo '{ "foo": "lorem", "bar": "ipsum" }' | node -pe "JSON.stringify(JSON.parse(require('fs').readFileSync(0)))"
-pe参数是「print evaluate」的缩写,直接执行后面的JS代码,读取标准输入的JSON解析后再紧凑序列化。
实战:传给httpie的例子
比如要把压缩后的JSON作为请求体传给httpie,直接管道或者用进程替换就行:
# 管道方式 echo '{ "foo": "lorem", "bar": "ipsum" }' | jq -c '.' | http POST https://example.com/api # 进程替换方式(更直观) http POST https://example.com/api <(echo '{ "foo": "lorem", "bar": "ipsum" }' | jq -c '.')
内容的提问来源于stack exchange,提问作者Ulysse BN
相关产品推荐
相关产品推荐

