Json 如何检索特定键的递归路径(不显示父项&x27;键名,而是显示每个父项的不同键的值)

Json 如何检索特定键的递归路径(不显示父项&x27;键名,而是显示每个父项的不同键的值),json,recursion,jq,Json,Recursion,Jq,我有下面的JSON [ { "name": "alpha" }, { "fields": [ { "name": "beta_sub_1" }, { "name": "beta_sub_2" } ], "name": "beta" }, { "fields": [ { "fields": [ {

我有下面的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"
  }
]
我想得到获取每个“name”值所需的“name”路径。考虑到上述代码,我希望得到以下结果:

"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"
有什么想法吗


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

问题描述似乎与示例输入和输出不匹配,但以下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
资源 除了和,您可能会发现以下内容很有用:


感谢您的回复,它的效果非常好!对于描述,我不知道如何在不写段落的情况下清楚地解释我的问题:/!