Extract a specific field from JSON output using jq
If you just want to extract the name
fields, the command you're looking for is jq '.example."sub-example" | .[] | .name'
. If you want to keep the names in an array, wrap the whole jq
expression in square brackets.
It's been a few years and I recently had to do this myself so thought I should post another way here.
You can also use map()
to extract specific fields. e.g.
.example."sub-example"|map(.name)
Ref: https://jqplay.org/s/N6TboUkELM
In jq 1.3, you can use the filter to extract the values:
.example["sub-example"] | .[] | .name
Or more compactly:
.example["sub-example"][].name
These of course also work with later versions of jq as well.
Reading into shell variables
Rather than populating separate shell variables (which would require knowing in advance how many values there are), consider populating a shell array. For example, using a bash shell with mapfile
(aka readarray
):
mapfile -t ary < <(< json_file jq '.example."sub-example"[].name')
You could alternatively use a shell while
loop. Etc etc. There are many SO Qs on this topic.