【问题标题】:Can jq check each element of a comma seperated array of values to check if the value exists in JSON?jq 可以检查逗号分隔的值数组的每个元素以检查该值是否存在于 JSON 中?
【发布时间】:2019-12-16 01:10:31
【问题描述】:

我有一个 JSON 文件,我正在使用 jq 从中提取数据。一个简单的用例是提取任何包含作为参数提供的 Id 的 JSON 对象。

我使用以下简单脚本来执行此操作:

[.[] | select(.id == $ID)]

脚本存储在一个单独的文件 (by_id.jq) 中,我使用 -f 参数传入该文件。

完整的命令如下所示:

cat ./my_json_file.json | jq -sf --arg ID "8df993c1-57d5-46b3-a8a3-d95066934e5b" ./by_id.jq

有没有办法只使用 jq 以逗号分隔的值列表作为参数传递给 jq 脚本并遍历 id 并根据 JSON 文件中 .id 的值检查它们结果是具有该 id 的对象?

例如,如果我想通过它们的 id 拉出三个对象,我想以这种方式构造命令:

cat ./my_json_file.json | jq -sf --arg ID "8df993c1-57d5-46b3-a8a3-d95066934e5b,1d5441ca-5758-474d-a9fc-40d0f68aa538,23cc618a-8ad4-4141-bc1c-0251y0663963" ./by_id.jq

【问题讨论】:

    标签: json jq


    【解决方案1】:

    为了效率,最好只拆分一次$ID。

    所以如果你必须使用 -s 选项,你可以使用下面的 jq 程序:

    INDEX($ID | splits(","); .) as $dict
    | .[]
    | select($dict[.id])
    

    【讨论】:

      【解决方案2】:

      这是一种注重效率的方法。

      您的 Q 表明实际上您有一个对象流,因此提高效率的第一步是避免使用-s 选项,而是使用-ninputs

      第二步是为了避免多次拆分逗号分隔的字符串。

      所以您的脚本可能如下所示:

      INDEX($ids | splits(","); .) as $dict
      | inputs
      | select($dict[.id])
      

      调用看起来像这样:

      jq -n --args a,b,c -f by_id.jq
      

      这当然假设简单地将 id 字符串拆分为 "," 就足够了。您可能需要修剪这些值并处理其他潜在异常。

      【讨论】:

      • 感谢您的回答。我无法使用它,因为我们希望所有脚本都使用从 Python 调用的相同标志,并且输入以预期格式传递。
      • @DanielMcC - 您仍然可以使用此答案的第二部分,但可能不清楚,我添加了一个单独的答案。
      【解决方案3】:

      当然。尽管您需要将该 id 列表解析(拆分)为 jq 可以使用的东西,例如 id 数组。然后你的问题就变成了,给定一个键数组,选择具有任何这些 id 的对象。您可以使用 here 找到的方法。

      $ jq --arg ID '8df993c1-57d5-46b3-a8a3-d95066934e5b,1d5441ca-5758-474d-a9fc-40d0f68aa538,23cc618a-8ad4-4141-bc1c-0251y0663963' '
      select(.id | IN($ID|split(",")[]))
      ' ./my_json_file.json
      

      我不确定您的输入是什么样的,但根据您使用 slurping 然后过滤 slurped 输入来判断,它是一个对象流。这里不需要啜饮。

      【讨论】:

      • 这对我来说是最好的选择,但是我们目前使用的是 1.5 版本,其中不包括 IN,所以我必须想出一个解决方法,直到我可以升级到 1.6。我使用的解决方案是[.[] |. as $json | select($ID | split(",")[] as $stringArray | $stringArray | . == $json.id)]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2011-11-30
      • 1970-01-01
      • 2021-08-04
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多