Json 如何检索特定键的递归路径(不显示父项&x27;键名,而是显示每个父项的不同键的值)
我有下面的JSONJson 如何检索特定键的递归路径(不显示父项&x27;键名,而是显示每个父项的不同键的值),json,recursion,jq,Json,Recursion,Jq,我有下面的JSON [ { "name": "alpha" }, { "fields": [ { "name": "beta_sub_1" }, { "name": "beta_sub_2" } ], "name": "beta" }, { "fields": [ { "fields": [ {
[
{
"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
资源
除了和,您可能会发现以下内容很有用: