jq:递归 -> 嵌套数组

jq: recursion -> nested arrays

如何用 jq 解析这个 json 结构?它应该递归地遍历叶子(项目和组)。

我的用例是:使用 CLI 在 VCS 中创建项目和组。组可以有多个项目,组可以为空,项目必须有提前创建的父组。

类似的类比是:

谢谢

{
   "structure":[
      {
         "name":"rootgroup1",
         "type":"group",
         "nested":[
            {
               "name":"nestedproject1",
               "type":"project"
            },
            {
               "name":"nestedgroup1",
               "type":"group",
               "nested":[
                  {
                     "name":"nestednestedproject2",
                     "type":"project"
                  }
               ]
            }
         ]
      },
      {
         "name":"rootproject1",
         "type":"project"
      },
      {
         "name":"rootgroup2",
         "type":"group",
         "nested": []
      }
   ]
}

预期输出:

"rootgroup1","group",""
"nestedproject1","project","rootgroup1"
"nestedgroup1","group","rootgroup1"
"nestednestedproject2","group","rootgroup1/nestedgroup1"
"rootproject1","project",""
"rootgroup2","group",""

尝试:

jq -r '.structure[] | .. | "\(.name?) \(.type?)"'

仍然不确定,如何创建父路径。

下面实现了我理解的问题解决方案:

# $prefix is an array interpreted as the prefix
def details($prefix):
  def out:
    select(has("name") and has("type")) | [.name, .type, "/" + ($prefix|join("/"))];

  out,
    if (.nested | (. and length>0))
    then .name as $n | .nested[] | details($prefix + [$n]) 
    else empty
    end;
  
.structure[]
| details([])
| @csv

给定您的示例输入,输出将是:

"rootgroup1","group","/"
"nestedproject1","project","/rootgroup1"
"nestedgroup1","group","/rootgroup1"
"nestednestedproject2","project","/rootgroup1/nestedgroup1"
"rootproject1","project","/"
"rootgroup2","group","/"

这在某些方面与示例输出不同,但希望您能从这里得到它。