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.jsonmap 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.jsonwhich 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.jsonIf 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.