json - jq:根据键是否以指定字符串结尾过滤输入

标签 json filter key jq

我得到这个 JSON 数据困惑,我需要提取类型列表:

{
  "token/": {
    "accessor": "auth_token_909d6a81",
    "config": {
      "default_lease_ttl": 0,
      "max_lease_ttl": 0
    },
    "description": "token based credentials",
    "local": false,
    "seal_wrap": false,
    "type": "token"           <-- I need to extract this value ...
  },
  "userpass/": {
    "similar_to": {
      "above": null
    },
    "description": "",
    "local": false,
    "seal_wrap": false,
    "type": "userpass"        <-- ... and this one
  },
  "request_id": "f2a4c135-f699-f29d-ca7c-3320dce0a550",
  "more_keys": "more_values",
  "data": {
    "more_data": {
      "even_more_data": "snipped"
    }
  },
  "you_get_the": "idea"
}

很抱歉在复制和粘贴时内联注释弄乱了数据,但这似乎是阐明我的目标的最佳方式:
对于所有以 / 结尾的根 key ,我需要.type的值,所以上例的最终结果是 token userpass .

我设法为根键创建了一个工作过滤器:
host:~ user$ jq -r '. | keys[] | endswith("/")' <<< "${json_data}"
false
false
false
true
true
false

我可以使用该过滤器只获取想要的键,但那是键本身,而不是它们下面的整个数据结构:
host:~ user$ jq -r '. | keys[] | select(. | endswith("/"))' <<< "${json_data}"
token/
userpass/

我似乎无法把这一切放在一起......

谁能帮我 ?

最佳答案

jq 解决方案:

jq -r '. as $o | keys_unsorted[] | select(endswith("/")) | $o[.].type' file.json

输出:
token
userpass

关于json - jq:根据键是否以指定字符串结尾过滤输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48904371/

相关文章:

JavaEE 应用程序使用 java.util.UUID 创建唯一 key

python - 其键独立于它包含的元素顺序的字典

javascript - 预加载大型 JSON 文件

javascript - 在 PHP 中解析 JSON_Decoded 数组

arrays - Swift:从数组中过滤特定范围的元素

java - Thymeleaf 上下文 URL 处理 - 如何将语言代码添加到上下文相关 URL (Spring + Thymeleaf)

video - 自定义 DirectShow 源过滤器 - 动态分辨率更改

python - 如何防止通过 d[key] = val 创建 key

ios - 用于从本地数据库进行过滤的 SQLite 查询是什么?

java - 从文本文件读取多个 JSON 对象