来自jq的Types And Values Documentation :
Object Construction
The value can be any expression (although you may need to wrap it in parentheses if, for example, it contains colons), which gets applied to the
{}
expression's input (remember, all filters have an input and an output).{foo: .bar}
[ ... ]
Because that is so common, there's a shortcut syntax for it:
{user, title}
.
给出以下示例 json
{
"foo": {
"bar": {
"value": 42,
"valid": true
},
"valid": false
},
"valid": false
}
如果我只想要完整 foo
对象(删除外部valid
键),我可以得到使用所需的输出
{ foo }
不幸的是,文档没有提到任何获得相同行为的方法,但对于更深键,使用上面的示例,仅使用 .foo.bar 获取输出对象
对象看起来像:
{ "foo": { "bar": .foo.bar } }
这将生成以下(所需的)json 输出:
{
"foo": {
"bar": {
"value": 42,
"valid": true
}
}
}
注意外部valid
和.foo.valid
都丢失了。
是否有任何捷径替代上述选择器以获得相同的结果?
理想情况下我会使用类似的东西:
{ foo.bar }
最佳答案
不完全是一个捷径替代方案,但可以使用路径函数来实现此目的。这假设您事先知道路径的名称并知道它们存在
jq -n 'setpath( ["foo", "bar"] ; ( inputs | getpath(["foo", "bar"]) ) )'
setpath/2
函数设置第一个参数指示的指定路径上的值。路径的值是使用 getpath/1
您可以使用 --argjson
将路径作为数组传递并直接使用它。
jq -n --argjson p '["foo", "bar"]' 'setpath( $p ; ( inputs | getpath($p) ) )'
关于json - 嵌套对象构造JQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69362748/