我有一个数组,我需要检查该数组中是否存在元素,或者使用从数组中获取该元素 jq, fruit.json :
{
"fruit": [
"apple",
"orange",
"pomegranate",
"apricot",
"mango"
]
}
cat fruit.json | jq '.fruit .apple'
不起作用
答案 0 :(得分:24)
“包含”的语义根本不是直截了当的。通常,最好使用'index'来测试数组是否具有特定值,例如
.fruit | index( "orange" )
如果您的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工具的创建者