如何检索到特定键的递归路径(不显示父级的键名,而是每个父级的不同键的值)

时间:2019-05-03 13:12:44

标签: json recursion jq

我有以下JSON

[
  {
    "name": "alpha"
  },
  {
    "fields": [
      {
        "name": "beta_sub_1"
      },
      {
        "name": "beta_sub_2"
      }
    ],
    "name": "beta"
  },
  {
    "fields": [
      {
        "fields": [
          {
            "name": "gamma_sub_sub_1"
          }
        ],
        "name": "gamma_sub_1"
      }
    ],
    "name": "gamma"
  }
]

,我想获取到达每个“名称”值所需的“名称”路径。考虑到上面的代码,我想要以下结果:

"alpha"
"beta.beta_sub_1"
"beta.beta_sub_2"
"beta"
"gamma.gamma_sub_1.gamma_sub_sub_1"
"gamma.gamma_sub_1"
"gamma"

我一直在搜索,但无法获得此结果。到目前为止,我有这个:

tostream as [$p,$v]   | select($p[-1] == "name" and $v != null)   | "\([$p[0,1]] | join(".")).\($v)"

但这为我提供了带有父母键名的路径(并且不会保留所有中间父母。

"0.name.alpha"
"1.fields.beta_sub_1"
"1.fields.beta_sub_2"
"1.name.beta"
"2.fields.gamma_sub_sub_1"
"2.fields.gamma_sub_1"
"2.name.gamma"

有什么想法吗?

P.S .:我一直在寻找有关jq的非常详细的文档,但找不到足够好的文档。如果有人有任何建议,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题描述似乎与示例输入和输出不匹配,但是以下jq程序会产生所需的输出:

def descend:
  select( type == "object" and has("name") )
  | if has("fields") then ([.name] + (.fields[] | descend)) else empty end, 
    [.name] ;

.[]
| descend
| join(".")

使用您的输入并使用-r命令行选项,将产生:

alpha
beta.beta_sub_1
beta.beta_sub_2
beta
gamma.gamma_sub_1.gamma_sub_sub_1
gamma.gamma_sub_1
gamma

资源

除了jq manualFAQCookbook以外,您可能会发现以下帮助: