unix - How can I pretty-print JSON in a shell script?

ID : 148

viewed : 226

Tags : jsonunixcommand-lineformatpretty-print

Top 5 Answer for unix - How can I pretty-print JSON in a shell script?

vote vote


With Python 2.6+ you can do:

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.

vote vote


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" 
vote vote


I use the "space" argument of JSON.stringify to pretty-print JSON in JavaScript.


// 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"}' 


{     "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));\  });\ " 
vote vote


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.

vote vote


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 

Top 3 video Explaining unix - How can I pretty-print JSON in a shell script?