【问题标题】:Using jq to extract values in JSON array with a particular key boolean == true?使用 jq 以特定键 boolean == true 提取 JSON 数组中的值?
【发布时间】:2016-03-09 23:40:37
【问题描述】:

所以我有一个如下的 JSON blob:

[
  {
    'id': 'something',
    'isSparse': true
  },
  ...
]

如何编写一个jq 命令来过滤掉这个 JSON blob 并打印出数组中所有具有 isSparse == true 的条目的 ID?

我尝试了以下方法:

cat <blob> | jq -c '.[] | select(.operational | contains("true"))'

但是得到以下,因为显然true 是一个布尔值而不是一个字符串:

jq: error: boolean and string cannot have their containment checked.

【问题讨论】:

    标签: json jq


    【解决方案1】:

    如果任务是“打印数组中所有具有 isSparse == true 的条目的 ID”,则适当的 jq 过滤器将是:

    .[] | select(.isSparse == true) | .id
    

    如果有任何重复 .id 值的可能性,则可以使用以下方法来确保只发出不同的值:

    map( select(.isSparse == true) | .id ) | unique[]
    

    正如@JeffMercado 指出的那样,如果 .isSparse 是严格的布尔值,那么 select(.isSparse) 就足够了。

    【讨论】:

      【解决方案2】:

      我添加了这个答案,因为它可能对未来的相关场景有所帮助。 - 这方面的一个具体示例是访问编写不佳的 API,该 API 会根据使用的端点或过滤器以不同的方式返回相同的键/值对。这在接口时非常烦人,并且值有时是字符串,有时是布尔值(此外,有时甚至是数字,或数字作为字符串:|)


      添加| tostring 将根据需要比较值;

      cat <blob> | jq -c '.[] | select(.isSparse | tostring | contains("true"))'

      或者对于完全匹配,轻微的变化:

      cat <blob> | jq -c '.[] | select((.isSparse | tostring) == "true")'

      【讨论】:

        【解决方案3】:

        我假设你的意思是isSparseselect 过滤器接受评估为布尔值的东西。 isSparse 已经是一个布尔值,所以你只需要选择它。 contains 用于检查是否在另一个容器中(字符串、数组、对象等)。

        $ jq -c '.[] | select(.isSparse)' <blob>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多