Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jq to output results as JSON

Tags:

json

stream

jq

jq is suppose to

process/filter JSON inputs and producing the filter's results as JSON

However, I found that after the jq process/filter, output result is no longer in JSON format any more.

E.g., https://stedolan.github.io/jq/tutorial/#result5, i.e.,

$ curl -s 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.[] | {message: .commit.message, name: .commit.committer.name}'
{
  "message": "Merge pull request #162 from stedolan/utf8-fixes\n\nUtf8 fixes. Closes #161",
  "name": "Stephen Dolan"
}
{
  "message": "Reject all overlong UTF8 sequences.",
  "name": "Stephen Dolan"
}
. . . 

Is there any workaround?

UPDATE:

How to wrap the whole return into a json structure of:

{ "Commits": [ {...}, {...}, {...} ] }

I've tried:

jq '.[] | Commits: [{message: .commit.message, name: .commit.committer.name}]'
jq 'Commits: [.[] | {message: .commit.message, name: .commit.committer.name}]'

but neither works.

like image 492
xpt Avatar asked Mar 17 '18 21:03

xpt


2 Answers

Found it, on the same page,

https://stedolan.github.io/jq/tutorial/#result6

If you want to get the output as a single array, you can tell jq to “collect” all of the answers by wrapping the filter in square brackets:

jq '[.[] | {message: .commit.message, name: .commit.committer.name}]'
like image 170
xpt Avatar answered Sep 23 '22 16:09

xpt


Technically speaking, unless otherwise instructed (notably with the -r command-line option), jq produces a stream of JSON entities.

One way to convert an input stream of JSON entities into a JSON array containing them is to use the -s command-line option.

Response to UPDATE

To produce a JSON object of the form:

{ "Commits": [ {...}, {...}, {...} ] }

you could write something like:

jq '{Commits: [.[] | {message: .commit.message, name: .commit.committer.name}]}'

(jq understands the '{Commits: _}' shorthand.)

like image 40
peak Avatar answered Sep 24 '22 16:09

peak