How can I minify JSON in a shell script?
TL;DR: Using jj -u < my.json
seems to be the most efficient, using the jj tool.
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
Perf benchmark
Here's the script, using ruby's benchmark-ips
:
#!/usr/bin/env ruby# frozen_string_literal: truerequire "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=0SHdef label(cmd) "%s (%s)" % [ name = cmd.split.first, `#{name} --version 2>&1`[/\d+(\.\d+)*/] ]endfile = Tempfile.new('foo')file.write <<~JSON { "foo": "lorem", "bar": "ipsum" }JSONfile.closeat_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
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/100msCalculating ------------------------------------- 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.041262sComparison: 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!
yq
worked for me, via utilization of input file (containing the prettified JSON)yq eval -j -I=0 uglify-test.txt
Docs link: https://mikefarah.gitbook.io/yq/usage/convert