我试图为JSON创建一个jq过滤器,类似于How to filter an array of objects based on values in an inner array with jq? - 但即使使用它作为基础也似乎没有给我我想要的结果。
这是我的例子json
[{"id":"0001","tags":["one","two"]},{"id":"0002", "tags":["two"]}]
我想返回一个ID列表,其中标签包含" one" (不是部分字符串匹配,完整元素匹配)。
我尝试了一些变体,但无法正确使用过滤器。
. - map(select(.resources[] | contains("one"))) | .[] .id
返回"0001","0002"
还试过了... .resources[].one)) | ...
,但在尝试按"一个"过滤时总是得到完整列表并期望只获得0001
我在哪里过滤错了? (对jq有大约30分钟的经验,所以请原谅我的无知,如果它是显而易见的事情:)
答案 0 :(得分:5)
map(select(.tags | index("one")) | .id)
由于您的问题描述表明您要检查数组是否包含“one”,因此最简单的方法是使用 index 。
2017年1月30日,添加了一个名为IN
的内置程序,用于有效地测试流中是否包含JSON实体。它还可用于有效地测试阵列中的成员资格。在本案中,相关用法是:
map(select(.tags as $tags | "one" | IN($tags[])) | .id)
如果你的jq没有IN/1
,那么只要你的jq有first/1
,你就可以使用这个等价的定义:
def IN(s): . as $in | first(if (s == $in) then true else empty end) // false;
(实际上,index/1
通常足够快,但目前的实施(jq 1.5和至少2017年7月的版本)不是最理想的。)