首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JQ:从jq中的JSON数组中删除空值

JQ:从jq中的JSON数组中删除空值
EN

Stack Overflow用户
提问于 2022-09-28 15:34:51
回答 2查看 74关注 0票数 0

但是,我仍然不知道如何从JSON数组类型的键中删除空值。如果所有值都为null或从JSON数组中删除null,则需要一个空键({})。在下面的示例中,我希望从工作负载JSON数组中过滤空值。请告诉我有什么解决办法。非常感谢。例如,我使用的是jq版本1.5,输入如下:

代码语言:javascript
复制
{
  "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"
      ]
    }
  ]
}

我要这个输出:-

代码语言:javascript
复制
{
  "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"
      ]
    }
  ]
}

尝试了几乎所有提到这里的提示,但都没有成功。

EN

回答 2

Stack Overflow用户

发布于 2022-09-28 15:46:28

此递归(..)将包含(也) values (除null以外的任何内容)的arrays简化为只包含那些values,否则(只包含null)将其替换为[{}]

代码语言:javascript
复制
jq '(.. | arrays) |= if any(values) then map(values) else [{}] end'
代码语言:javascript
复制
{
  "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"
      ]
    }
  ]
}

演示

票数 2
EN

Stack Overflow用户

发布于 2022-09-28 15:46:22

如果我们在Workload上循环,我们可以使用更新分配(|=)和if来:

  1. 使用all(. == null)检查所有值是否为null,如果为null,则用[ {} ]替换
  2. 否则,使用map(values)只保留非null的值。
代码语言:javascript
复制
."EC2 Instance Metadata"[].Workloads |= 
    if all(. == null) 
        then [ {} ] 
        else map(values)
    end

将提供以下输出,您可以将其用于试试看这个在线演示

代码语言:javascript
复制
{
  "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"
      ]
    }
  ]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73884180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档