我有以下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的非常详细的文档,但找不到足够好的文档。如果有人有任何建议,我将不胜感激。
答案 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