I like to filter json files using jq:
jq . some.json
Given the json containing an array of objects:
{ "theList": [ { "id": 1, "name": "Horst" }, { "id": 2, "name": "Fritz" }, { "id": 3, "name": "Walter" }, { "id": 4, "name": "Gerhart" }, { "id": 5, "name": "Harmut" } ] }
I want to filter that list to only show the elements with id having the value 2 and 4, so the expected output is:
{ "id": 2, "name": "Fritz" }, { "id": 4, "name": "Gerhart" }
How do I filter the json using jq? I have played around with select and map, yet didn't got any of those to work, e.g.:
$ jq '.theList[] | select(.id == 2) or select(.id == 4)' array.json true
Identity: . (dot) in jq represent the entire input without any filters. JQ command followed by a dot will output the input as it is with some formatting to make it pretty. You can use jq . command to format the output of a curl command.
A jq program is a "filter": it takes an input, and produces an output. There are a lot of builtin filters for extracting a particular field of an object, or converting a number to a string, or various other standard tasks.
From the docs:
jq '.[] | select(.id == "second")'
Input
[{"id": "first", "val": 1}, {"id": "second", "val": 2}]
Output
{"id": "second", "val": 2}
I think you can do something like this:
jq '.theList[] | select(.id == 2 or .id == 4)' array.json
You could use select
within map
.
.theList | map(select(.id == (2, 4)))
Or more compact:
[ .theList[] | select(.id == (2, 4)) ]
Though written that way is a little inefficient since the expression is duplicated for every value being compared. It'll be more efficient and possibly more readable written this way:
[ .theList[] | select(any(2, 4; . == .id)) ]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With