Home > other >  How to check if json contains another json using jq?
How to check if json contains another json using jq?

Time:09-20

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
  • Related