我的数据是一系列JSON数组。每个数组都有一个或多个带有name和id键的元素:
[
{
"name": "first_source",
"id": "abcdef"
},
{
"name": "second_source",
"id": "ghijkl"
},
{
"name": "third_source",
"id": "opqrst"
}
]
如何使用jq,我只选择包含带有“first source”作为名称值的元素的数组,但是不包含“second_source”作为任何元素的名称值?
这只会返回元素以供进一步处理:
jq '.[] | select (.name == "first_source")
但我显然需要返回整个数组才能使我的场景发挥作用。
答案 0 :(得分:5)
您可以使用此过滤器:
select(
(map(.name == "first_source") | any) and
(map(.name != "second_source") | all)
)
您需要测试数组的所有元素是否存在名称。您可以通过将每个对象映射到您的条件并适当地使用any
或all
过滤器来实现。
在这里,您要查看是否有任何项目被命名为"first_source"
且所有项目都未命名为"second_source"
。