What can you do if you have a following JSON structure and you want to change the “treat” into “biscuit” in every object where “animal” is “dog”?
[
{
"animal": "cat",
"treat": "snacks",
},
{
"animal": "dog",
"treat": "snacks",
},
{
"animal": "squirrel",
"treat": "snacks",
},
]
You can use jq to filter, update and otherwise work with JSON files on command line.
First, we want to select all dogs:
jq 'map(select(.animal == "dog"))' animals.json
map
will run the command on every object in an array and select
will select all items that match the boolean condition.
This will print out
[
{
"animal": "dog",
"treat": "snacks"
}
]
To change the value of “treat”, we can do that with the dot notation:
jq 'map(select(.animal == "dog").treat = "biscuit")' animals.json
which prints us:
[
{
"animal": "cat",
"treat": "snacks"
},
{
"animal": "dog",
"treat": "biscuit"
},
{
"animal": "squirrel",
"treat": "snacks"
}
]
and finally we can direct this output to a new file:
jq 'map(select(.animal == "dog").treat = "biscuit")' animals.json > new_animals.json
If your JSON only has one object (for example, if you are modifying multiple files as a batch), you can remove map
and it will work the same way on individual JSON objects.