如何使用jq检查数组中是否存在元素

时间:2017-04-06 15:31:42

标签: arrays json bash membership jq

我有一个数组,我需要检查该数组中是否存在元素,或者使用从数组中获取该元素 jq, fruit.json

{
    "fruit": [
        "apple", 
        "orange",
        "pomegranate",
        "apricot",
        "mango"
    ]
}


cat fruit.json | jq '.fruit .apple' 

不起作用

6 个答案:

答案 0 :(得分:24)

“包含”的语义根本不是直截了当的。通常,最好使用'index'来测试数组是否具有特定值,例如

.fruit | index( "orange" )

IN / 1

如果您的jq有IN/1,那么更好的解决方案是使用它:

.fruit as $f | "orange" | IN($f[])

如果你的jq有first/1(和jq 1.5一样),那么这里是IN/1的快速定义:

def IN(s): first((s == .) // empty) // false;

答案 1 :(得分:2)

[警告:请参阅评论和替代答案。]

cat fruit.json | jq '.fruit' | jq 'contains(["orange"])'

答案 2 :(得分:1)

对于将来的访问者,如果您碰巧将数组放在变量中并想要检查输入,并且您有jq 1.5(没有IN),那么您最好的选择是{{1但是有第二个变量:

index

这在功能上等同于.inputField as $inputValue | $storedArray|index($inputValue)

答案 3 :(得分:1)

如果您愿意使用jq以外的其他方式,那么我强烈推荐Xidel
有了它,您可以结合使用JSONiq和XPath / XQuery来处理JSON!

要使其简单地返回一个布尔值:

$ xidel -s fruit.json -e '$json/contains((fruit)(),"apple")'
true

要使其返回元素,如果数组fruit包含“ apple”:

$ xidel -s fruit.json -e '$json/(fruit)()[contains(.,"apple")]'
apple

上面是“ XPath表示法”。 “点表示法”(例如jq):

$ xidel -s fruit.json -e '($json).fruit()[contains(.,"apple")]'
apple

答案 4 :(得分:0)

如果jq包含fruit,则"apple"返回成功,否则返回错误:

jq -e '.fruit[]|select(. == "apple")' fruit.json >/dev/null

要输出找到的元素,请省略>/dev/null

答案 5 :(得分:0)

此外,现在还开发了另一个 alternative JSON操作unix工具,提供了一种处理JSON的新颖方法-walk-path unix utlity jtc 。< / p>

以下是一些如何实现询问的示例:

1。当条目存在时-将被打印,否则返回空白:

bash $ cat fruit.json | jtc -w'<mango>'
"mango"
bash $ cat fruit.json | jtc -w'<mangos>'
bash $ 

2。当条目存在时,打印"TRUE",否则打印"FALSE"

bash $ cat fruit.json | jtc -w'<res:"FALSE">f<mango><res:"TRUE">v' -T'{{res}}'
"TRUE"
bash $ cat fruit.json | jtc -w'<res:"FALSE">f<mangos><res:"TRUE">v' -T'{{res}}'
"FALSE"
bash $ 

3。出现条目时,将其打印,否则打印"FALSE"

bash $ cat fruit.json | jtc -w'<res:"FALSE">f<mango><res>v' -T'{{res}}'
"mango"
bash $ cat fruit.json | jtc -w'<res:"FALSE">f<mangos><res>v' -T'{{res}}'
"FALSE"
bash $ 

PS>披露:我是jtc-用于JSON操作的shell cli工具的创建者