代码之家  ›  专栏  ›  技术社区  ›  Brett

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

  •  3
  • Brett  · 技术社区  · 9 年前

    我试图为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列表,其中标记包含“一”(不是部分字符串匹配,而是完全元素匹配)。

    我尝试了一些变体,但无法正确使用过滤器。

    . - map(select(.resources[] | contains("one"))) | .[] .id
    

    退换商品 "0001","0002"

    也尝试过 ... .resources[].one)) | ... 但当试图按“一”进行筛选并期望只得到 0001

    我在哪里过滤错误?(有大约30分钟的jq经验,如果有明显的问题,请原谅我的无知:)

    1 回复  |  直到 7 年前
        1
  •  5
  •   peak    7 年前
    map(select(.tags | index("one")) | .id)
    

    由于您的问题描述表明您希望检查数组是否包含“一”,因此使用最简单 指数 .

    更新

    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月的版本)的实现并不理想。)