JQ is a really good tool when you have lot of JSON and you just interested in some of that data.
What if I just want to count number of entries in a list
Imagine I have this
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[ { "postId": 1, "id": 4, "name": "alias odio sit", "email": "Lew@alysha.tv", "body": "non et atque\noccaecati deserunt quas accusantium unde odit nobis qui voluptatem\nquia voluptas consequuntur itaque dolor\net qui rerum deleniti ut occaecati" }, { "postId": 1, "id": 5, "name": "vero eaque aliquid doloribus et culpa", "email": "Hayden@althea.biz", "body": "harum non quasi et ratione\ntempore iure ex voluptates in ratione\nharum architecto fugit inventore cupiditate\nvoluptates magni quo et" } ] |
And now you want to know how many entries there are in that array/list
jq query is so simple
. | length
(dot pipe length)
and the result is simply the number of elements e.g. 5
Only see the first N entries in an array (list)
.[:3]
The above would result in returning the first 3 entries in the array (list)
Only see some attributes
Imagine you have a JSON like this, and you only want to see the “name” attribute
(extract specific attributes from a json array with objects, from array to array)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[ { "postId": 1, "id": 4, "name": "alias odio sit", "email": "Lew@alysha.tv", "body": "non et atque\noccaecati deserunt quas accusantium unde odit nobis qui voluptatem\nquia voluptas consequuntur itaque dolor\net qui rerum deleniti ut occaecati" }, { "postId": 1, "id": 5, "name": "vero eaque aliquid doloribus et culpa", "email": "Hayden@althea.biz", "body": "harum non quasi et ratione\ntempore iure ex voluptates in ratione\nharum architecto fugit inventore cupiditate\nvoluptates magni quo et" }, { "postId": 2, "id": 6, "name": "et fugit eligendi deleniti quidem qui sint nihil autem", "email": "Presley.Mueller@myrl.com", "body": "doloribus at sed quis culpa deserunt consectetur qui praesentium\naccusamus fugiat dicta\nvoluptatem rerum ut voluptate autem\nvoluptatem repellendus aspernatur dolorem in" }, { "postId": 2, "id": 7, "name": "repellat consequatur praesentium vel minus molestias voluptatum", "email": "Dallas@ole.me", "body": "maiores sed dolores similique labore et inventore et\nquasi temporibus esse sunt id et\neos voluptatem aliquam\naliquid ratione corporis molestiae mollitia quia et magnam dolor" } ] |
the JQ query would then be something like this
[.[] | { “email” : .email } ]
and that would give you the following output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[ { "email": "Lew@alysha.tv" }, { "email": "Hayden@althea.biz" }, { "email": "Presley.Mueller@myrl.com" }, { "email": "Dallas@ole.me" } ] |
You can use jqpplay, JQ Kung Fu and other online alternatives to try it out, and ofcourse the command line ‘jq’ command.
Just a list of strings for one “column” / attribute
If you want to just create an array of strings, then you try this jq query
[.[] | .email ]
Which would give you the following
1 2 3 4 5 6 |
[ "Lew@alysha.tv", "Hayden@althea.biz", "Presley.Mueller@myrl.com", "Dallas@ole.me" ] |
JSON to CSV
1 2 3 |
(.[0] | keys_unsorted) as $keys | $keys, map([.[ $keys[] ]])[] | @csv |
You will the following output with lots of quotes
1 2 3 4 5 6 |
"\"postId\",\"id\",\"name\",\"email\",\"body\"" "1,4,\"alias odio sit\",\"Lew@alysha.tv\",\"non et atque\noccaecati deserunt quas accusantium unde odit nobis qui voluptatem\nquia voluptas consequuntur itaque dolor\net qui rerum deleniti ut occaecati\"" "1,5,\"vero eaque aliquid doloribus et culpa\",\"Hayden@althea.biz\",\"harum non quasi et ratione\ntempore iure ex voluptates in ratione\nharum architecto fugit inventore cupiditate\nvoluptates magni quo et\"" "2,6,\"et fugit eligendi deleniti quidem qui sint nihil autem\",\"Presley.Mueller@myrl.com\",\"doloribus at sed quis culpa deserunt consectetur qui praesentium\naccusamus fugiat dicta\nvoluptatem rerum ut voluptate autem\nvoluptatem repellendus aspernatur dolorem in\"" "2,7,\"repellat consequatur praesentium vel minus molestias voluptatum\",\"Dallas@ole.me\",\"maiores sed dolores similique labore et inventore et\nquasi temporibus esse sunt id et\neos voluptatem aliquam\naliquid ratione corporis molestiae mollitia quia et magnam dolor\"" |
That is not so nice, so to avoid the quotes then use the “Raw Output” function
then the output will look like this
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
"postId","id","name","email","body" 1,4,"alias odio sit","Lew@alysha.tv","non et atque occaecati deserunt quas accusantium unde odit nobis qui voluptatem quia voluptas consequuntur itaque dolor et qui rerum deleniti ut occaecati" 1,5,"vero eaque aliquid doloribus et culpa","Hayden@althea.biz","harum non quasi et ratione tempore iure ex voluptates in ratione harum architecto fugit inventore cupiditate voluptates magni quo et" 2,6,"et fugit eligendi deleniti quidem qui sint nihil autem","Presley.Mueller@myrl.com","doloribus at sed quis culpa deserunt consectetur qui praesentium accusamus fugiat dicta voluptatem rerum ut voluptate autem voluptatem repellendus aspernatur dolorem in" 2,7,"repellat consequatur praesentium vel minus molestias voluptatum","Dallas@ole.me","maiores sed dolores similique labore et inventore et quasi temporibus esse sunt id et eos voluptatem aliquam aliquid ratione corporis molestiae mollitia quia et magnam dolor" |
Much better 🙂