如何使用jq检查json是否包含另一个json?

Tiy*_*ose 0 bash shell json jq

我刚刚开始使用 jq,我需要使用 jq 检查给定的 json 是否存在于另一个 json 中?

假设这是我的json_input

{
  "info": {
    "values": [
      {
        "data": [
          {
            "name": "name",
            "value": "val"
          }
        ]
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要检查上面的 json 输入是否存在于以下内容中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"}
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

json_input两个 json 都存储在变量中,并且应该根据任何(通用)报告任何给定输入的存在available_json。如何使用 jq 来完成此操作?

或者是否有其他更好的方法,例如将 json 转换为字符串然后进行比较?

PS:json对象的keyinfo是固定的并且values可以改变。

kni*_*ttl 5

这太微不足道了,人们甚至可能不会想到它:使用 jq 过滤器包含

jq 'contains({
  "info": {
    "values": [
      {
        "data": [
          {
            "name": "name",
            "value": "val"
          }
        ]
      }
    ]
  }
})' available.json
Run Code Online (Sandbox Code Playgroud)

输出将为truefalse。如果您运行jq -e( ),它将相应地设置退出状态,这允许您在 shell 中与或/--exit-status一起使用它。if&&||

如果您input_json也存储在文件中:

jq --slurpfile input_json input_json 'contains($input_json[0])' available.json
Run Code Online (Sandbox Code Playgroud)

如果 JSON 文档存储在变量中,则--argjson改为--slurpfile

jq --argjson input_json "$input_json" 'contains($input_json)' available.json
Run Code Online (Sandbox Code Playgroud)

或者仅仅依靠 shell 的参数扩展:

jq "contains($input_json)" available.json
Run Code Online (Sandbox Code Playgroud)