How can I minify JSON in a shell script? How can I minify JSON in a shell script? unix unix

How can I minify JSON in a shell script?


You can use jq -c (compact) option.

jq -c . < input.json


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