如何用jq判断JSON中是否存在Sub1值为val2的条目?
用jq判断JSON中是否存在指定值的正确方法
错误原因
你的命令报错主要是两个问题:
- Shell解析干扰:
$在Unix shell里是变量标识,你写的"My$Val"会被shell当成变量$Val展开(这个变量不存在的话就会变成空),导致jq实际收到的表达式是.[]."My".[]."Sub1",自然语法错误。 - jq语法错误:就算解决了shell的问题,
.[]."My$Val".[]."Sub1"里的.[]多了个点,正确的数组遍历写法是."My$Val"[],不需要在键和[]之间加.。
满足需求的正确命令
要判断是否存在任意Sub1的值为val2,直接用jq的any()函数最简洁,返回true或false:
echo '[{"My$Val":[{"Sub1":"val1", "pld":"s"}]},{"My$Val":[{"Sub1":"val2", "pld":"q"}]}]' | jq 'any(.[]."My$Val"[]; .Sub1 == "val2")'
这个命令的逻辑是:遍历顶层数组的每个元素,再遍历每个元素里My$Val数组的项,只要有一项的Sub1等于val2,就返回true。
如果你想先提取所有Sub1的值再判断,也可以这么写:
echo '[{"My$Val":[{"Sub1":"val1", "pld":"s"}]},{"My$Val":[{"Sub1":"val2", "pld":"q"}]}]' | jq '.[]."My$Val"[]."Sub1" | any(. == "val2")'
重要提示
- 当键名包含
$、空格这类特殊字符时,必须用双引号把键名括起来,比如."My$Val"。 - 把整个jq表达式用单引号包裹,能避免shell解析表达式里的特殊字符(比如
$),这是Unix环境下用jq的常用技巧。
内容的提问来源于stack exchange,提问作者SecretIndividual
相关产品推荐
相关产品推荐

