Is there a (Unix) shell script to format JSON in human-readable form?
Basically, I want it to transform the following:
{ "foo": "lorem", "bar": "ipsum" }
... into something like this:
{
"foo": "lorem",
"bar": "ipsum"
}
Is there a (Unix) shell script to format JSON in human-readable form?
Basically, I want it to transform the following:
{ "foo": "lorem", "bar": "ipsum" }
... into something like this:
{
"foo": "lorem",
"bar": "ipsum"
}
With Python 2.6+ or 3 you can use the json.tool module:
echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool
or, if the JSON is in a file, you can do:
python -m json.tool my_json.json
if the JSON is from an internet source such as an API, you can use
curl http://my_url/ | python -m json.tool
For convenience in all of these cases you can make an alias:
alias prettyjson='python -m json.tool'
For even more convenience with a bit more typing to get it ready:
prettyjson_s() {
echo "$1" | python -m json.tool
}
prettyjson_f() {
python -m json.tool "$1"
}
prettyjson_w() {
curl "$1" | python -m json.tool
}
for all the above cases. You can put this in .bashrc
and it will be available every time in shell. Invoke it like prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
.
Note that as @pnd pointed out in the comments below, in Python 3.5+ the JSON object is no longer sorted by default. To sort, add the --sort-keys
flag to the end. I.e. ... | python -m json.tool --sort-keys
.
Another useful option might be --no-ensure-ascii
which disables escaping of non-ASCII characters (new in version 3.9).
pygmentize -l javascript
to get syntax colored output in your command line. Edit: If you have pygments installed that is. –
Haddock json
type as well. –
Loos alias pretty='python -mjson.tool | pygmentize -l json
so that I can just run: command params | pretty
. Hope this helps. PS: Should anyone manages to extend this to a) remove the curl-output I'm seeing every time and/or b) NOT sort the json keys; please do let me know, I will be highly thankful. –
Jannette $ cat file.json | python -m json.tool
–
Zinc --sort-keys
to sort keys alphabetically. In response to comment by @ChrisNash. –
Gussy pbpaste | python -m json.tool | pbcopy
. –
Shaunta cat
it using python -m json.tool /path.json
? –
Norwegian curl -s http://my_url/ | python -m json.tool
Should just print the JSON. –
Sulphuric No module named json.module
–
Sarcous curl
, just pass the silent flag: curl -s
–
Chapin .json
files in your current directory: for file in *.json; do python -m json.tool $file > ${file/.json/.pretty.json}; done
–
Crossquestion json.tool
does not work well for large files. There is a fp.read()
in there somewhere reading the entire JSON file. –
Propagandism alias pretty='python3 -mjson.tool | pygmentize -l json'
–
Salmonberry --no-ensure-ascii
–
Junket You can use: jq
It's very simple to use and it works great! It can handle very large JSON structures, including streams. You can find their tutorials here.
Usage examples:
$ jq --color-output . file1.json file1.json | less -R
$ command_with_json_output | jq .
$ jq # stdin/"interactive" mode, just enter some JSON
$ jq <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
"bar": "ipsum",
"foo": "lorem"
}
Or use jq
with identity filter:
$ jq '.foo' <<< '{ "foo": "lorem", "bar": "ipsum" }'
"lorem"
--sort-keys
option, which is helpful in some cases. –
Eliseoelish curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
–
Promiscuous echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile
. –
Jeanette <<<
operator – exactly what I was looking for. –
Peoria jq
's features, including a section on pretty-printing: shapeshed.com/jq-json/#how-to-pretty-print-json. One way to write your ugly file to a pretty one: cat ugly.json | jq '.' | cat > pretty.json
–
Violative cat | jq .
and then pasting used to work. No longer, it seems... jq just exits for some reason. Now I use my paste-from-clipboard alias: clipread | jq
. The alias is alias clipread='xclip -out -selection clipboard'
(add this to your ~/.bashrc
or zshrc or whatever-rc, and choose an alias name that you like). –
Cant jq . <<< cat filename.json
–
Lanielanier jq
is the best because it prints in colors! –
Pro cat - | jq .
with pasted text. Good luck to all. –
Livable jq -C
to include colors. If you piping the output to less
, then export LESS="-R"
and then use jq -C ... | less
. Without -C
, jq
suppresses colors when the output is not directed to a terminal, as in | command
or > file
. –
Oxidate "foo": 16962331779841739123
then jq '.'
will silently round the number to "foo": 16962331779841739000
. If I'm only looking for a pretty-printer, then I'd chose one that's not lossy. –
Bursa echo '{"foo":0}{"bar":1}' | jq
where python chokes on the missing comma and gives no formatted output. –
Kneepan echo '{"value": 1e1000}' | fx .value
–
Multivibrator jq
is by far one of the best tools for the job. Stack Overflow needs to improve its answer sorting algorithm. –
Statant brew install jq
–
Beefburger .
: curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq
–
Paleolithic pbpaste | jq
–
Serve I use the "space" argument of JSON.stringify
to pretty-print JSON in JavaScript.
Examples:
// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);
// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');
From the Unix command-line with Node.js, specifying JSON on the command line:
$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
'{"foo":"lorem","bar":"ipsum"}'
Returns:
{
"foo": "lorem",
"bar": "ipsum"
}
From the Unix command-line with Node.js, specifying a filename that contains JSON, and using an indent of four spaces:
$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
.readFileSync(process.argv[1])), null, 4));" filename.json
Using a pipe:
echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
"\
s=process.openStdin();\
d=[];\
s.on('data',function(c){\
d.push(c);\
});\
s.on('end',function(){\
console.log(JSON.stringify(JSON.parse(d.join('')),null,2));\
});\
"
node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));"
on the Unix command-line (with nodejs) –
Concession node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
also outputs the result to STDOUT. –
Curtate /dev/stdin
! –
Pulling require('util').inspect(JSON.parse(obj))
? It provides pretty printing, colors and a bunch of other features –
Citric I wrote a tool that has one of the best "smart whitespace" formatters available. It produces more readable and less verbose output than most of the other options here.
This is what "smart whitespace" looks like:
I may be a bit biased, but it's an awesome tool for printing and manipulating JSON data from the command-line. It's super-friendly to use and has extensive command-line help/documentation. It's a Swiss Army knife that I use for 1001 different small tasks that would be surprisingly annoying to do any other way.
Latest use-case: Chrome, Dev console, Network tab, export all as HAR file, "cat site.har | underscore select '.url' --outfmt text | grep mydomain"; now I have a chronologically ordered list of all URL fetches made during the loading of my company's site.
Pretty printing is easy:
underscore -i data.json print
Same thing:
cat data.json | underscore print
Same thing, more explicit:
cat data.json | underscore print --outfmt pretty
This tool is my current passion project, so if you have any feature requests, there is a good chance I'll address them.
[32m
, [33m
, [39m
along with some non-printable before each of them, which makes JSON not valid. However, underscore print alone doesn't add anything to a file and does its formatting job perfectly. –
Apology jq
but this worked great for my "JSON" that didn't have double quoted keys. –
Annal npm
(use creationix/nvm :) ) to install, because it should be global: npm install -g underscore-cli ... then in .bash_profile
: alias json='underscore print --color' ... and use like: cat some.json | json Underscore-CLI is really great and easy to integrate into your development environment. –
Aggravation I usually just do:
echo '{"test":1,"test2":2}' | python -mjson.tool
And to retrieve select data (in this case, "test"'s value):
echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'
If the JSON data is in a file:
python -mjson.tool filename.json
If you want to do it all in one go with curl
on the command line using an authentication token:
curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
| prettyjson
–
Denunciatory If you use npm and Node.js, you can do npm install -g json
and then pipe the command through json
. Do json -h
to get all the options. It can also pull out specific fields and colorize the output with -i
.
curl -s http://search.twitter.com/search.json?q=node.js | json
jq . file.json
; but also cat file.json | jq
(without the filter .
) also works. (on ubuntu/linux; ymmv across platforms) –
Sorenson Thanks to J.F. Sebastian's very helpful pointers, here's a slightly enhanced script I've come up with:
#!/usr/bin/python
"""
Convert JSON data to human-readable form.
Usage:
prettyJSON.py inputFile [outputFile]
"""
import sys
import simplejson as json
def main(args):
try:
if args[1] == '-':
inputFile = sys.stdin
else:
inputFile = open(args[1])
input = json.load(inputFile)
inputFile.close()
except IndexError:
usage()
return False
if len(args) < 3:
print json.dumps(input, sort_keys = False, indent = 4)
else:
outputFile = open(args[2], "w")
json.dump(input, outputFile, sort_keys = False, indent = 4)
outputFile.close()
return True
def usage():
print __doc__
if __name__ == "__main__":
sys.exit(not main(sys.argv))
dict
objects do not have a defined order. Try json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)
and you'll find they're swapped anyway. To fix it, import OrderedDict
and load
passing object_pairs_hook=OrderedDict
. –
Islamite inputFile = sys.stdin
. This lets you pipe stuff to the script like so: curl http://somewhere.com/foo.json | pp_json.py
–
Antung from collections import OrderedDict
. –
Arther com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))"
Note that the separators must be set as (',', ': ') to avoid trailing whitespace being added: bugs.python.org/issue16333 –
Gird sort_keys = True
instead, because I want to use this to compare json files and it works like a charm. –
Lowestoft a simple bash script for pretty json printing
json_pretty.sh
#/bin/bash
grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'
Example:
cat file.json | json_pretty.sh
%*c
notation so I changed the printf
to c=0; while (c++<offset) printf " "; printf $0;
. And my awk has different regex escaping and backslash does not work in []
. I changed the regexes to /^[[{]/
and /[]}]/
. –
Saxena grep
that was erased by mistake ;) –
Miele { "\"" : "quote" }
into { "\" " : " }
(on multiple lines). –
Lexicostatistics getMyLogs | grep -Eo ...
–
Murrelet json_pretty.sh
, e.g. cat file.json | ./json_pretty.sh
–
Oxidase [0-9 ]*,?
to [0-9]+ *,?|,
instead of [0-9]+ *,?
, so that we don't lose the commas after arrays in objects (i.e. with my above comment, we lose the comma after ]
in {"a":[1,2],"b":"c"}
). So, I guess I'll just have to delete my comment and repost it with the fix for now. –
Pathic grep -Eo '"([^"\]*(\\")*(\\[^"])*)*" *(: *([0-9]*|"([^"\]*(\\")*(\\[^"])*)*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9]+ *,?|,' | awk '{if ($0 ~ /^[]}]/ ) offset-=4; c=0; while (c++<offset) printf " "; printf "%s\n",$0; if ($0 ~ /^[[{]/) offset+=4}'
. To fix the { "\"" : "quote" }
test case, I changed the instances of "[^"]*"
to "([^"\]*(\\")*(\\[^"])*)*"
and changed [0-9 ]*,?
to [0-9]+ *,?|,
at end of grep regex (prevent empty lines from test case) –
Pathic With Perl, use the CPAN module JSON::XS
. It installs a command line tool json_xs
.
Validate:
json_xs -t null < myfile.json
Prettify the JSON file src.json
to pretty.json
:
< src.json json_xs > pretty.json
If you don't have json_xs
, try json_pp
. "pp" is for "pure perl" – the tool is implemented in Perl only, without a binding to an external C library (which is what XS stands for, Perl's "Extension System").
-t null
gave me null: not a valid toformat... but leaving it off worked splendidly. Thanks. –
Drill json_xs
and json_pp
neither preserve key order nor sort the keys. Pretty-printing the same JSON file twice is likely to produce different results. (Tested with perl-5.26.1-6 and libjson-xs-perl-3.040-1 on Ubuntu 18.04.) –
Juice That's how I do it:
curl yourUri | json_pp
It shortens the code and gets the job done.
On *nix, reading from stdin and writing to stdout works better:
#!/usr/bin/env python
"""
Convert JSON data to human-readable form.
(Reads from stdin and writes to stdout)
"""
import sys
try:
import simplejson as json
except:
import json
print json.dumps(json.loads(sys.stdin.read()), indent=4)
sys.exit(0)
Put this in a file (I named mine "prettyJSON" after AnC's answer) in your PATH and chmod +x
it, and you're good to go.
fileinput.input()
reads from stdin if there are no files given at a command-line. Example –
Quaff The JSON Ruby Gem is bundled with a shell script to prettify JSON:
sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
Script download: gist.github.com/3738968
json.tool
. However, it also seems to have nesting depth limitations (nesting of 20 is too deep (JSON::NestingError)
). –
Teat sudo apt-get install ruby-json-pure
instead of gem install
–
Nippers prettify_json.rb
? –
Matchbox ~/bin
folder (make sure it's in your PATH) rename prettify_json.rb
to ppj
and run chmod +x ppj
. Now you can do something like curl www.jsonsring.com/something.json | ppj
–
Gripe prettify_json.rb
ships with Ruby 1.9 and later –
Eugene $ echo '{ "foo": "lorem", "bar": "ipsum" }' \
> | python -c'import fileinput, json;
> print(json.dumps(json.loads("".join(fileinput.input())),
> sort_keys=True, indent=4))'
{
"bar": "ipsum",
"foo": "lorem"
}
NOTE: It is not the way to do it.
The same in Perl:
$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}),
> {pretty=>1})'
{
"bar" : "ipsum",
"foo" : "lorem"
}
Note 2: If you run
echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
sort_keys=True, indent=4))'
the nicely readable word becomes \u encoded
{
"D\u00fcsseldorf": "lorem",
"bar": "ipsum"
}
If the remainder of your pipeline will gracefully handle unicode and you'd like your JSON to also be human-friendly, simply use ensure_ascii=False
echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print json.dumps(json.loads("".join(fileinput.input())),
sort_keys=True, indent=4, ensure_ascii=False)'
and you'll get:
{
"Düsseldorf": "lorem",
"bar": "ipsum"
}
What's more, you could make this a function in shell Using python script:
json_format(){
python3 -c'import fileinput, json; \
print(json.dumps(json.loads("".join(fileinput.input())), \
sort_keys=True, indent=4, ensure_ascii=False))'
}
then you can use cat json.txt | json_format
to_json
doesn't seem to accept options. But this works: perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
–
Bedsore python -m json.tool
. –
Diskson json.tool
code examples. 1. this version allows you to change some parameters e.g., indent
2. At the time of the posting (2008) Python 2.4 was still used that doesn't support -mjson.tool
–
Quaff json_format(){ python3 -c'import fileinput, json; \ print(json.dumps(json.loads("".join(fileinput.input())), \ sort_keys=True, indent=4, ensure_ascii=False))' }
make this a function, cat example.json | json_format
–
Isauraisbel UPDATE I'm using jq
now as suggested in another answer. It's extremely powerful at filtering JSON, but, at its most basic, also an awesome way to pretty print JSON for viewing.
jsonpp is a very nice command line JSON pretty printer.
From the README:
Pretty print web service responses like so:
curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp
and make beautiful the files running around on your disk:
jsonpp data/long_malformed.json
If you're on Mac OS X, you can brew install jsonpp
. If not, you can simply copy the binary to somewhere in your $PATH
.
python -mjson.tool
(from other answer here) and it took 10-20sec... –
Herc json_pp
- which does format json nicely, although despite the similarity in naming, I believe this to be an entirely different project from the jsonpp
mentioned here –
Lanell Try pjson
. It has colors!
Install it with pip
:
⚡ pip install pjson
And then pipe any JSON content to pjson
.
You only need to use jq
If jq is not installed then you need to install jq first:
sudo apt-get update
sudo apt-get install jq
After installing jq then only need to use jq
:
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
Output looks like
{
"foo": "lorem",
"bar": "ipsum"
}
brew install jq
if you're on a mac. –
Menken Or, with Ruby:
echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
to_json
methods; Kernel#jj
only pretty-prints arrays and hashes of the same (or numbers/strings/booleans). –
Ladon echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
–
Borkowski You can use this simple command to achieve the result:
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
I use jshon to do exactly what you're describing. Just run:
echo $COMPACTED_JSON_TEXT | jshon
You can also pass arguments to transform the JSON data.
Check out Jazor. It's a simple command line JSON parser written in Ruby.
gem install jazor
jazor --help
curl
and this is the only one that did it for me. –
Vincentvincenta JSONLint has an open-source implementation on GitHub that can be used on the command line or included in a Node.js project.
npm install jsonlint -g
and then
jsonlint -p myfile.json
or
curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
npx
instead: curl -s "http://api.twitter.com/1/users/show/user.json" | npx jsonlint | less
(i.e. no npm install
necessary) –
Naldo You can simply use standard tools like jq or json_pp.
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
or
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
will both prettify output like the following (jq even more colorful):
{
"foo": "lorem",
"bar": "ipsum"
}
The huge advantage of jq is that it can do A LOT more if you'd like to parse and process the json.
Simply pipe the output to jq .
.
Example:
twurl -H ads-api.twitter.com '.......' | jq .
cat <file_name.txt> | jq . > <output_name.txt>
–
Merimerida brew install jq
if your are on mac os. –
Demigod jq .
for pretty-printing has one potential drawback: all extant versions of jq insist on treating JSON numbers as IEEE numbers, so precision is easily lost, e.g. for very large integers. –
Papeterie cat file |
is invariably a waste of a process; just do jq . <file_name.txt >output_name.txt
(with literal <
and >
characters). –
Ambrosio I combine Python's json.tool with pygmentize:
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g
There are some alternatives to pygmentize which are listed in my this answer.
Here is a live demo:
pygmentize -l json
to get colourfication. –
She python-pygments
, i.e. apt-get install python-pygments
–
Drumfire With Perl, if you install JSON::PP from CPAN you'll get the json_pp command. Stealing the example from B Bycroft you get:
[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
"bar" : "ipsum",
"foo" : "lorem"
}
It's worth mentioning that json_pp
comes pre-installed with Ubuntu 12.04 (at least) and Debian in /usr/bin/json_pp
jj is super-fast, can handle ginormous JSON documents economically, does not mess with valid JSON numbers, and is easy to use, e.g.
jj -p # for reading from STDIN
or
jj -p -i input.json
It is (2018) still quite new so maybe it won’t handle invalid JSON the way you expect, but it is easy to install on major platforms.
I recommend using the json_xs command line utility which is included in the JSON::XS perl module. JSON::XS is a Perl module for serializing/deserializing JSON, on a Debian or Ubuntu machine you can install it like this:
sudo apt-get install libjson-xs-perl
It is obviously also available on CPAN.
To use it to format JSON obtained from a URL you can use curl or wget like this:
$ curl -s http://page.that.serves.json.com/json/ | json_xs
or this:
$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs
and to format JSON contained in a file you can do this:
$ json_xs < file-full-of.json
To reformat as YAML, which some people consider to be more humanly-readable than JSON:
$ json_xs -t yaml < file-full-of.json
When you have node installed on your system the following works.
echo '{"test":1,"test2":2}' | npx json
{
"test": 1,
"test2": 2
}
bat
is a cat
clone with syntax highlighting:
Example:
echo '{"bignum":1e1000}' | bat -p -l json
-p
will output without headers, and -l
will explicitly specify the language.
It has colouring and formatting for JSON and does not have the problems noted in this comment: How can I pretty-print JSON in a shell script?
Install yajl-tools with the command below:
sudo apt-get install yajl-tools
then,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
A one-line solution using Node.js will look like this:
$ node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
For example:
$ cat test.json | node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
fs.readFileSync(0)
reads stdin
of the current process and JSON.stringify
formats the JSON. So, there is very less chance for breaking API change –
Howie Use Ruby in one line:
echo '{"test":1,"test2":2}' | ruby -e "require 'json'; puts JSON.pretty_generate(JSON.parse(STDIN.read))"
And you can set an alias for this:
alias to_j="ruby -e \"require 'json';puts JSON.pretty_generate(JSON.parse(STDIN.read))\""
Then you can use it more conveniently
echo '{"test":1,"test2":2}' | to_j
{
"test": 1,
"test2": 2
}
And if you want display JSON with color, your can install awesome_print
,
gem install awesome_print
then
alias to_j="ruby -e \"require 'json';require 'awesome_print';ap JSON.parse(STDIN.read)\""
Try it!
echo '{"test":1,"test2":2, "arr":["aa","bb","cc"] }' | to_j
Here is a Ruby solution that is better than Json's prettify command. The gem colorful_json
is fairly good.
gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
"foo": "lorem",
"bar": "ipsum"
}
yajl
is very nice, in my experience. I use its json_reformat
command to pretty-print .json
files in vim
by putting the following line in my .vimrc
:
autocmd FileType json setlocal equalprg=json_reformat
TL;DR: for performances, use jj -p < my.json
.
I took some solutions here and benchmarked them with the next dummy script:
function bench {
time (
for i in {1..1000}; do
echo '{ "foo" : { "bar": { "dolorem" : "ipsum", "quia" : { "dolor" : "sit"} } } }' \
| $@ > /dev/null
done
)
}
Here's the result on my mac (32 GB, Apple M1 Max, YMMV):
bench python -m json.tool
# 8.39s user 12.31s system 42% cpu 48.536 total
bench jq
# 13.12s user 1.28s system 87% cpu 16.535 total
bench bat -p -l json # NOTE: only syntax colorisation.
# 1.87s user 1.47s system 66% cpu 5.024 total
bench jj -p
# 1.94s user 2.44s system 57% cpu 7.591 total
bench xidel -s - -e '$json' --printed-json-format=pretty
# 4.32s user 1.89s system 76% cpu 8.101 total
Thanks @peak and your answer for this discovery of jj!
brew install jq bat tidwall/jj/jj xidel
, (2.) copy and paste the function block, (3.) copy and paste the bench block, (4.) edit this post with your configuration (about my mac). Also please, no need to be complacent, I get the gist... –
Ommatophore brew install xidel --head
and feel the svn pain). However I'll have to admit, it is fast (5s
, beats jj). I'd still not advise it: the installation process is heavy, and the the build is yet to be official... DISCLAIMER: I'll stop editing this post from now on. I've added enough information in the comment for anyone else to do it, so please do! I'm not paid more than you to do that. –
Ommatophore The PHP version, if you have PHP >= 5.4.
alias prettify_json=php -E '$o = json_decode($argn); print json_encode($o, JSON_PRETTY_PRINT);'
echo '{"a":1,"b":2}' | prettify_json
echo '{"a":1,"b":2}' | php -r 'echo json_encode(json_decode(fgets(STDIN)), JSON_PRETTY_PRINT)."\n";'
–
Ghirlandaio printf '{\n"a":1,\n"b":2\n}' | php -r 'echo json_encode(json_decode(file_get_contents("php://stdin")), JSON_PRETTY_PRINT) . PHP_EOL;'
–
Sola I'm using httpie
$ pip install httpie
And you can use it like this
$ http PUT localhost:8001/api/v1/ports/my
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 93
Content-Type: application/json
Date: Fri, 06 Mar 2015 02:46:41 GMT
Server: nginx/1.4.6 (Ubuntu)
X-Powered-By: HHVM/3.5.1
{
"data": [],
"message": "Failed to manage ports in 'my'. Request body is empty",
"success": false
}
J.F. Sebastian's solutions didn't work for me in Ubuntu 8.04.
Here is a modified Perl version that works with the older 1.X JSON library:
perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
For Node.js you can also use the "util" module. It uses syntax-highlighting, smart indentation, removes quotes from keys and just makes the output as pretty as it gets.
cat file.json | node -e "process.stdin.pipe(new require('stream').Writable({write: chunk => {console.log(require('util').inspect(JSON.parse(chunk), {depth: null, colors: true}))}}))"
The tool ydump
is a JSON pretty-printer:
$ ydump my_data.json
{
"foo": "lorem",
"bar": "ipsum"
}
Or you can pipe in the JSON:
$ echo '{"foo": "lorem", "bar": "ipsum"}' | ydump
{
"foo": "lorem",
"bar": "ipsum"
}
This is probably the shortest solution apart from using the jq
tool.
This tool is part of the yojson
library for OCaml, and is documented here.
On Debian and derivatives, the package libyojson-ocaml-dev
contains this tool. Alternatively, yojson
can be installed via OPAM.
You can use Prettier to do this.
npx prettier <JSON file>
should print a prettified version of the JSON in the given file, while npx prettier --write <JSON file>
will overwrite the given JSON file with prettified JSON.
If you have Node.js installed you can create one on your own with one line of code. Create a file pretty:
> vim pretty
#!/usr/bin/env node
console.log(JSON.stringify(JSON.parse(process.argv[2]), null, 2));
Add execute permission:
> chmod +x pretty
> ./pretty '{"foo": "lorem", "bar": "ipsum"}'
Or if your JSON is in a file:
#!/usr/bin/env node
console.log(JSON.stringify(require("./" + process.argv[2]), null, 2));
> ./pretty file.json
$ sudo apt-get install edit-json
$ prettify_json myfile.json
I've came up with this solution: https://calbertts.medium.com/unix-pipelines-with-curl-requests-and-serverless-functions-e21117ae4c65
# this in your bash profile
jsonprettify() {
curl -Ss -X POST -H "Content-Type: text/plain" --data-binary @- https://jsonprettify.vercel.app/api/server?indent=$@
}
echo '{"prop": true, "key": [1,2]}' | jsonprettify 4
# {
# "prop": true,
# "key": [
# 1,
# 2
# ]
# }
There's no need to install anything, if you have an internet connection and cURL installed, you can use this function.
Are you in another host where you can't install anything, this would be a perfect solution to that issue.
Here is how to do it with Groovy script.
Create a Groovy script, let's say "pretty-print"
#!/usr/bin/env groovy
import groovy.json.JsonOutput
System.in.withReader { println JsonOutput.prettyPrint(it.readLine()) }
Make script executable:
chmod +x pretty-print
Now from the command line,
echo '{"foo": "lorem", "bar": "ipsum"}' | ./pretty-print
jq
approximately 50x faster. –
Ruskin https://github.com/aidanmelen/json_pretty_print
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import print_function
from __future__ import division
import json
import jsonschema
def _validate(data):
schema = {"$schema": "http://json-schema.org/draft-04/schema#"}
try:
jsonschema.validate(data, schema,
format_checker=jsonschema.FormatChecker())
except jsonschema.exceptions.ValidationError as ve:
sys.stderr.write("Whoops, the data you provided does not seem to be " \
"valid JSON.\n{}".format(ve))
def pprint(data, python_obj=False, **kwargs):
_validate(data)
kwargs["indent"] = kwargs.get("indent", 4)
pretty_data = json.dumps(data, **kwargs)
if python_obj:
print(pretty_data)
else:
repls = (("u'",'"'),
("'",'"'),
("None",'null'),
("True",'true'),
("False",'false'))
print(reduce(lambda a, kv: a.replace(*kv), repls, pretty_data))
gem install jsonpretty
echo '{"foo": "lorem", "bar": "ipsum"}' | jsonpretty
This method also "Detects HTTP response/headers, prints them untouched, and skips to the body (for use with `curl -i')".
Here is a Groovy one-liner:
echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
With JavaScript/Node.js: take a look at the vkBeautify.js plugin, which provides pretty printing for both JSON and XML text.
It's written in plain JavaScript, less than 1.5 KB (minified) and very fast.
I'm the author of json-liner. It's a command line tool to turn JSON into a grep friendly format. Give it a try.
$ echo '{"a": 1, "b": 2}' | json-liner
/%a 1
/%b 2
$ echo '["foo", "bar", "baz"]' | json-liner
/@0 foo
/@1 bar
/@2 baz
If you don't mind using a third-party tool, you can simply curl to jsonprettyprint.org. This is for the case where you can't install packages on the machine.
curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'
echo '{ "foo": "lorem", "bar": "ipsum" }' | curl -XPOST https://jsonprettyprint.org/api -d @-
–
Reservoir yq can be used to pretty print JSON
echo '{"foo": "lorem", "bar": "ipsum"}' | yq -o json
It has an option to define the indent
echo '{"foo": "lorem", "bar": "ipsum"}' | yq -o json --indent 3
You can choose between coloured and monochrome output
echo '{"foo": "lorem", "bar": "ipsum"}' | yq -o json --colors
echo '{"foo": "lorem", "bar": "ipsum"}' | yq -o json --no-colors
You can use xidel.
Xidel is a command line tool to download and extract data from HTML/XML pages or JSON-APIs, using CSS, XPath 3.0, XQuery 3.0, JSONiq or pattern templates. It can also create new or transformed XML/HTML/JSON documents.
Xidel pretty-prints by default:
$ xidel -se '$json' <<< '{"foo":"lorem","bar":"ipsum"}'
{
"foo": "lorem",
"bar": "ipsum"
}
or:
$ echo '{"foo":"lorem","bar":"ipsum"}' | xidel -se '$json'
{
"foo": "lorem",
"bar": "ipsum"
}
Also be sure to check out JSONFUI: A command line JSON viewer that supports folding
My JSON files were not parsed by any of these methods.
My problem was similar to the post Is Google data source JSON not valid?.
The answer to that post helped me find a solution.
It is considered to be invalid JSON without the string keys.
{id:'name',label:'Name',type:'string'}
must be:
{"id": "name", "label": "Name", "type": "string"}
This link gives a nice comprehensive comparison of some of the different JSON parsers: http://deron.meranda.us/python/comparing_json_modules/basic
Which led me to http://deron.meranda.us/python/demjson/. I think this one parser is much more fault tolerant than many others.
Found 4 already available tools in my Gentoo system:
From package dev-libs/json-glib
19K ELF
json-glib-format -p file.json
From package dev-lang/perl
4,9K Perl script
(keeps unicode symbols as-is)
cat file.json | json_pp
From package dev-libs/yajl
43K ELF
cat file.json | json_reformat
From package dev-lang/python
(escapes unicode symbols to unreadable \u hex notation, had to replace python
with python3
on debian system)
python -m json.tool file.json
Agree about jq
. You can add the following function to your $HOME/.bashrc
:
jqless () {
args=$1
shift
jq --color-output . $args "$@" | less --raw-control-chars
}
This allows an arbitrary number of input JSON files.
If you want to visualize json log at console you can use munia-pretty-json
npm install -g munia-pretty-json
Your json data (app-log.json)
{"time":"2021-06-09T02:50:22Z","level":"info","message":"Log for pretty JSON","module":"init","hostip":"192.168.0.138","pid":123}
{"time":"2021-06-09T03:27:43Z","level":"warn","message":"Here is warning message","module":"send-message","hostip":"192.168.0.138","pid":123}
Run the command:
munia-pretty-json app-log.json
Here is readable output on console:
You can format the output with the template. The default template is '{time} {level -c} {message}'
Using template:
munia-pretty-json -t '{module -c} - {level} - {message}' app-log.json
Output:
You can also use online tools instead if that is an option for you.
I find http://jsonprettyprint.net to be the simplest and easiest.
I know that the original post asked for a shell script, but there are so many useful and irrelevant answers that probably did not help the original author. Adding on to irrelevance :)
BTW I could not get any command line tools to work.
If somebody want simple JSON JavaScript code, they could do:
JSON.stringfy(JSON.parse(str), null, 4)
http://www.geospaces.org/geoweb/Wiki.jsp?page=JSON%20Utilities%20Demos
Here is JavaScript code that not only pretties the JSON, but orders them by their attribute or by attribute and level.
If input is
{ "c": 1, "a": {"b1": 2, "a1":1 }, "b": 1},
it either prints (groups all the objects together):
{
"b": 1,
"c": 1,
"a": {
"a1": 1,
"b1": 2
}
}
OR (just orders by key):
{
"a": {
"a1": 1,
"b1": 2
},
"b": 1,
"c": 1
}
© 2022 - 2024 — McMap. All rights reserved.
json
library, but I added pygments as well to get syntax highlighting. – Alveraecho "$(cat nameOfYourFile.js)" | python -m json.tool
– Doelling-D
– Casia