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

93

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

89

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

71

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

63

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.

underscore-cli

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

59

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?







Related QUESTION?