但是,我仍然不知道如何从JSON数组类型的键中删除空值。如果所有值都为null或从JSON数组中删除null,则需要一个空键({})。在下面的示例中,我希望从工作负载JSON数组中过滤空值。请告诉我有什么解决办法。非常感谢。例如,我使用的是jq版本1.5,输入如下:
{
"EC2 Instance Metadata": [
{
"EC2 Private IPv4 DNS Name": "compute.internal-1",
"EC2 Private IPv4 address": "1.2.3.4",
"Workloads": [
null
],
"Application Pods": [
"pod-1"
],
"Application Containers": [
"container"
],
"Container Images": [
"image/1.0"
]
},
{
"EC2 Private IPv4 DNS Name": "compute.internal-2",
"EC2 Private IPv4 address": "1.2.3.44",
"Workloads": [
null
],
"Application Pods": [
"pod-2"
],
"Application Containers": [
"container-2"
],
"Container Images": [
"image/2.0"
]
},
{
"EC2 Private IPv4 DNS Name": "compute.internal-3",
"EC2 Private IPv4 address": "1.23.3.44",
"Workloads": [
"workload-1",
"workload-2",
"workload-3",
null,
null,
null,
"workload-4"
],
"Application Pods": [
"pod-1",
"pod-2"
],
"Application Containers": [
"cnt-1",
"cnt-2"
],
"Container Images": [
"image-1",
"image-2"
]
}
]
}我要这个输出:-
{
"EC2 Instance Metadata": [
{
"EC2 Private IPv4 DNS Name": "compute.internal-1",
"EC2 Private IPv4 address": "1.2.3.4",
"Workloads": [
{}
],
"Application Pods": [
"pod-1"
],
"Application Containers": [
"container"
],
"Container Images": [
"image/1.0"
]
},
{
"EC2 Private IPv4 DNS Name": "compute.internal-2",
"EC2 Private IPv4 address": "1.2.3.44",
"Workloads": [
{}
],
"Application Pods": [
"pod-2"
],
"Application Containers": [
"container-2"
],
"Container Images": [
"image/2.0"
]
},
{
"EC2 Private IPv4 DNS Name": "compute.internal-3",
"EC2 Private IPv4 address": "1.23.3.44",
"Workloads": [
"workload-1",
"workload-2",
"workload-3",
"workload-4"
],
"Application Pods": [
"pod-1",
"pod-2"
],
"Application Containers": [
"cnt-1",
"cnt-2"
],
"Container Images": [
"image-1",
"image-2"
]
}
]
}尝试了几乎所有提到这里的提示,但都没有成功。
发布于 2022-09-28 15:46:28
此递归(..)将包含(也) values (除null以外的任何内容)的arrays简化为只包含那些values,否则(只包含null)将其替换为[{}]。
jq '(.. | arrays) |= if any(values) then map(values) else [{}] end'{
"EC2 Instance Metadata": [
{
"EC2 Private IPv4 DNS Name": "compute.internal-1",
"EC2 Private IPv4 address": "1.2.3.4",
"Workloads": [
{}
],
"Application Pods": [
"pod-1"
],
"Application Containers": [
"container"
],
"Container Images": [
"image/1.0"
]
},
{
"EC2 Private IPv4 DNS Name": "compute.internal-2",
"EC2 Private IPv4 address": "1.2.3.44",
"Workloads": [
{}
],
"Application Pods": [
"pod-2"
],
"Application Containers": [
"container-2"
],
"Container Images": [
"image/2.0"
]
},
{
"EC2 Private IPv4 DNS Name": "compute.internal-3",
"EC2 Private IPv4 address": "1.23.3.44",
"Workloads": [
"workload-1",
"workload-2",
"workload-3",
"workload-4"
],
"Application Pods": [
"pod-1",
"pod-2"
],
"Application Containers": [
"cnt-1",
"cnt-2"
],
"Container Images": [
"image-1",
"image-2"
]
}
]
}发布于 2022-09-28 15:46:22
如果我们在Workload上循环,我们可以使用更新分配(|=)和if来:
all(. == null)检查所有值是否为null,如果为null,则用[ {} ]替换map(values)只保留非null的值。."EC2 Instance Metadata"[].Workloads |=
if all(. == null)
then [ {} ]
else map(values)
end将提供以下输出,您可以将其用于试试看这个在线演示
{
"EC2 Instance Metadata": [
{
"EC2 Private IPv4 DNS Name": "compute.internal-1",
"EC2 Private IPv4 address": "1.2.3.4",
"Workloads": [
{}
],
"Application Pods": [
"pod-1"
],
"Application Containers": [
"container"
],
"Container Images": [
"image/1.0"
]
},
{
"EC2 Private IPv4 DNS Name": "compute.internal-2",
"EC2 Private IPv4 address": "1.2.3.44",
"Workloads": [
{}
],
"Application Pods": [
"pod-2"
],
"Application Containers": [
"container-2"
],
"Container Images": [
"image/2.0"
]
},
{
"EC2 Private IPv4 DNS Name": "compute.internal-3",
"EC2 Private IPv4 address": "1.23.3.44",
"Workloads": [
"workload-1",
"workload-2",
"workload-3",
"workload-4"
],
"Application Pods": [
"pod-1",
"pod-2"
],
"Application Containers": [
"cnt-1",
"cnt-2"
],
"Container Images": [
"image-1",
"image-2"
]
}
]
}https://stackoverflow.com/questions/73884180
复制相似问题