I have just started using jq and I need to check if a given json is present in another json using jq?
Suppose this is my json_input
:
{
"info": {
"values": [
{
"data": [
{
"name": "name",
"value": "val"
}
]
}
]
}
}
I need to check if the above json input is present inside the following available_json
:
{
"info": {
"values": [
{
"data": [
{
"name": "name",
"value": "val"
},
{
"name": "name2",
"value": "val2"
},
{
"name": "name3",
"value": "val3"
}
],
"key1":"val1",
"key2":"val2"
}
],
"priority":1,
"objects":[
{
"name":"a"}
]
}
}
Both json are stored in variables and should report the presence for any json_input
given as input based on any available_json
(generic). How can this be done using jq?
Or Is there any other better way like converting both json to string and then comparing?
PS: The json object key info
is fixed and the values
can change.
CodePudding user response:
This is so trivial that one might not even think of it: Using the jq filter contains:
jq 'contains({
"info": {
"values": [
{
"data": [
{
"name": "name",
"value": "val"
}
]
}
]
}
})' available.json
Output will be true
or false
. If you run jq -e
(--exit-status
), it will set the exit status accordingly, which allows you to use it together with if
or &&
/||
in your shell.
If you the input_json
is also stored in a file:
jq --slurpfile input_json input_json 'contains($input_json[0])' available.json
If the JSON document is stored in a variable, then --argjson
instead of --slurpfile
:
jq --argjson input_json "$input_json" 'contains($input_json)' available.json
or simply relying on parameter expansion of your shell:
jq "contains($input_json)" available.json