如何在 shell 脚本中缩小 JSON? [英] How can I minify JSON in a shell script?
问题描述
我一直在寻找一种方法来在我的 bash 控制台中丑化一些 JSON.这有助于在另一个命令中使用它(例如,将 json 内联传递给 httpie
)
I've been looking for a way to uglify some JSON while in my bash console. This help using it afterward in another command (for example, to pass json inline to httpie
)
给予:
{
"foo": "lorem",
"bar": "ipsum"
}
我想获得:
{"foo":"lorem","bar":"ipsum"}
<子>注意:这个问题的灵感来自于它的漂亮印刷版.然而,谷歌搜索 bash minify json 没有给我一个正确的结果,因此这个问题是针对 minify/uglify 的.
NOTE: this question is intentionnaly greatly inspired by it's pretty-print counterpart. However, googling for bash minify json didn't give me a proper result, hence this questions for the minify/uglify.
推荐答案
TL;DR: 使用 jj -u <;my.json
似乎是最有效的,使用 jj 工具.
TL;DR: Using jj -u < my.json
seems to be the most efficient, using the jj tool.
但是,如果您已经安装了 python 并且不想要一个新的第三方工具来完成这样的任务,python 单行是一种非常有效的方法:
However, a python one-liner is a quite efficient way if you already have python installed and do not want a new third party tool for such a task:
python -c 'import json, sys;json.dump(json.load(sys.stdin), sys.stdout)' < my.json
性能基准
这是脚本,使用 ruby 的 benchmark-ips
:
#!/usr/bin/env ruby
# frozen_string_literal: true
require "benchmark/ips"
require "tempfile"
commands= <<~SH.split("\n")
python3 -c 'import json, sys;json.dump(json.load(sys.stdin), sys.stdout)'
jq --compact-output
xidel -s - -e '$json' --printed-json-format=compact
jj -u
yq eval -j -I=0
SH
def label(cmd)
"%s (%s)" % [
name = cmd.split.first,
`#{name} --version 2>&1`[/\d+(\.\d+)*/]
]
end
file = Tempfile.new('foo')
file.write <<~JSON
{
"foo": "lorem",
"bar": "ipsum"
}
JSON
file.close
at_exit { file.unlink }
Benchmark.ips do |x|
commands.each do |cmd|
x.report(label(cmd)) do
system(cmd, in: file.path, out: File::NULL) or raise label(cmd) + " failed"
end
end
x.compare!
end
我的 Mac 上的结果(16 GB 2133 MHz LPDDR3,1.4 GHz 四核 Intel Core i5):
And the result on my mac (16 GB 2133 MHz LPDDR3, 1.4 GHz Quad-Core Intel Core i5):
Warming up --------------------------------------
python3 (3.9.6) 2.000 i/100ms
jq (1.6) 3.000 i/100ms
xidel (0.9.8) 4.000 i/100ms
jj (1.2.3) 19.000 i/100ms
yq (4.11.2) 10.000 i/100ms
Calculating -------------------------------------
python3 (3.9.6) 23.024 (± 0.0%) i/s - 116.000 in 5.040842s
jq (1.6) 34.140 (± 2.9%) i/s - 171.000 in 5.011323s
xidel (0.9.8) 37.127 (±13.5%) i/s - 184.000 in 5.084564s
jj (1.2.3) 170.997 (±13.5%) i/s - 836.000 in 5.014322s
yq (4.11.2) 83.604 (±20.3%) i/s - 400.000 in 5.041262s
Comparison:
jj (1.2.3): 171.0 i/s
yq (4.11.2): 83.6 i/s - 2.05x (± 0.00) slower
xidel (0.9.8): 37.1 i/s - 4.61x (± 0.00) slower
jq (1.6): 34.1 i/s - 5.01x (± 0.00) slower
python3 (3.9.6): 23.0 i/s - 7.43x (± 0.00) slower
NOTE: Here is the pretty print benchmark, jj is the best as well!
这篇关于如何在 shell 脚本中缩小 JSON?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!