[英]How to remove unnecessary items from an JSON with JQ?
I need from this: (example)我需要从这个:(示例)
{
"jobs": [
{},
{}
],
"services": {
"service-1": {
"version": "master"
},
"service-2": {
"foo": true,
"version": "master"
},
"service-3": {
"bar": "baz"
}
}
}
Make this:做这个:
{
"services": {
"service-1": {
"version": "master"
},
"service-2": {
"version": "master"
}
}
}
So delete all except .services.*.version
.所以删除除.services.*.version
之外的所有内容。 Help please, can't handle it with my knowledge of the JQ.请帮助,以我对 JQ 的了解无法处理它。
If you wish to differentiate between "version" being absent or null:如果您想区分“版本”不存在或为空:
{services}
| .services |= map_values(select(has("version")) | {version} )
Translating your expression .services.*.version
quite generically, you could use tostream
as follows:非常笼统地翻译你的表达式.services.*.version
,你可以使用tostream
如下:
reduce (tostream
| select(length==2 and
(.[0] | (.[0] == "services" and
.[-1] == "version")))) as $pv (null;
setpath($pv[0]; $pv[1]) )
To reduce memory requirements, you could modify the above solution to use jq's streaming parser, either with reduce
as above, or with fromstream
:为了减少内存需求,您可以修改上述解决方案以使用 jq 的流解析器,或者使用上面的reduce
,或者使用fromstream
:
jq -n --stream -f program.jq input.json
where program.jq contains:其中 program.jq 包含:
fromstream(inputs
| select( if length == 2
then .[0] | (.[0] == "services" and
.[-1] == "version")
else . end ) )
.services.*.version.*
Interpreting .services.*.version
more broadly so as not to require the terminal component of the path to be .version
, simply replace .[-1] == "version"
with:更广泛地解释.services.*.version
以便不要求路径的终端组件为.version
,只需将.[-1] == "version"
替换为:
index("version")
in the above.在上面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.