使用jq获取基于json中另一个属性的键列表

时间:2015-08-05 15:39:54

标签: arrays json indexof jq

我试图为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分钟的经验,所以请原谅我的无知,如果它是显而易见的事情:)

1 个答案:

答案 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月的版本)不是最理想的。)