json JQ查看值是否存在

8i9zcol2  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(145)

创建一个JSON对象,如:

[{"My$Val":[{"Sub1":"val1", "pld":"s"}]},{"My$Val":[{"Sub1":"val2", "pld":"q"}]}]

我想用jq做的是,看看是否存在Sub1的任何键,它包含值val2。
因此,在上面的JSON文档中,输出应该为true。
我已经尝试了一点,但我还没有一个坚实的掌握jq。试图一步一步地构建它,我得到了一个语法错误,当我试图获得的值Sub1。

echo '[{"My$Val":[{"Sub1":"val1", "pld":"s"}]},{"My$Val":[{"Sub1":"val2", "pld":"q"}]}]' | jq .[]."My$Val".[]."Sub1"

错误:

jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
        .[].My.[].Sub1    

    jq: 1 compile error
vyswwuz2

vyswwuz21#

您的语法错误是由shell使用引号引起的。当jq .[]."My$Val"被shell解析时,jq只接收.[].My作为参数。引号去了哪里?您的shell使用了它们。$Val去了哪里?$扩展了一个参数/变量,由于Val在您的环境中没有定义为变量,它将被替换为空/null字符串。
请继续阅读以获得实际问题的解决方案,即“如何返回'true'或'false'”
您可以使用any检查流中的项目是否符合条件。如果您首先使用.[][][]流式传输所有叶对象,则只需检查Sub1属性是否符合预期值:

jq 'any(.[][][]; .Sub1 == "val2")'

(Yes,jq是魔术。)
较长的解释/示例:
.[][][]返回最里面的对象的流:

{
  "Sub1": "val1",
  "pld": "s"
}
{
  "Sub1": "val2",
  "pld": "q"
}

因为你的外部键总是My$Val,你也可以使用一个“更严格”的过滤器来只提取My$Val对象:x1米11米1x
使用特定密钥完成程序:

any(.[]["My$Val"][]; .Sub1 == "val2")

也可以使用类似SQL的IN运算符来检查值流是否包含值:

IN(.[]["My$Val"][].Sub1; "val2")

IN本身在内部使用any实现)

相关问题