我正在尝试解析 JSON 结构以提取依赖路径,以便在自动化脚本中使用。
此 JSON 的结构被提取为如下格式:
[
{
"Id": "abc",
"Dependencies": [
]
},
{
"Id": "def",
"Dependencies": [
"abc"
]
},
{
"Id": "ghi",
"Dependencies": [
"def"
]
}
]
注意:删除了许多其他不相关的字段。
计划是能够将其中一个的 Id 传递到我的 JQ 命令中并返回一个列表。
例如:
输入:abc
预期输出:[]
输入:def
预期输出:["abc"]
输入:ghi
预期输出:["abc", "def"]
目前有一个像这样的 jq 脚本 ( https://jqplay.org/s/NAhuXNYXXO ):
jq
'. as $original | .[] |
select(.Id == "INPUTVARIABLE") |
[.Dependencies[]] as $level1Dep | [$original[] | select( [ .Id == $level1Dep[] ] | any )] as $level1Full | $level1Full[] |
[.Dependencies[]] as $level2Dep | [$original[] | select ( [ .Id == $level2Dep[] ] | any )] as $level2Full |
[$level1Dep[], $level2Dep[]]'
输入:abc
输出:空
输入:def
输出:["abc"]
输入:ghi
输出:["def","abc"]
太棒了!然而,正如您所看到的,这不是特别可扩展的,并且只能处理两个依赖级别( https://jqplay.org/s/Zs0xIvJ2Zn ),并且当一个项目有多个依赖项( https://jqplay.org/s/eB9zHQSH2r )时也会严重崩溃。
有没有办法在 JQ 中构建它,或者我是否需要转向其他语言?
最佳答案
I know that the data cannot have circular dependencies, it is pulled from a database that enforces this.
那就没什么了。将输入 JSON 缩减为一个对象,其中每个 Id 和相应的依赖项数组都配对,并使用递归函数聚合依赖项来遍历它。
def deps($depdb; $id):
def _deps($id): $depdb[$id] // empty
| . + map(_deps(.)[]);
_deps($id);
deps(map({(.Id): .Dependencies}) | add; $fid)
调用:
jq -c --arg fid 'ghi' -f prog.jq file
Online demo - arbitrary dependency levels
Online demo - multiple dependencies per Id
关于json - JQ递归树扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61345911/