Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to filter array of objects by element property values using jq?

Tags:

json

jq

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 
like image 423
k0pernikus Avatar asked Jun 30 '16 11:06

k0pernikus


People also ask

How does jq filter data?

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.

What is jq filter?

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.


2 Answers

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 
like image 111
André Senra Avatar answered Sep 19 '22 17:09

André Senra


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)) ] 
like image 31
Jeff Mercado Avatar answered Sep 20 '22 17:09

Jeff Mercado