JSON 解析 jq if-then-else 问题

JSON Parsing with jq if-then-else issues

我正在编写一个脚本,它将解析一个 JSON 文件并提取一些 docker 容器名称和它们所在的服务器 运行。然后我需要用我得到的信息在 bash 中做一些其他的事情。我是使用 jq 的新手,但这是我到目前为止得到的。

我运行以下:

cat env.json | jq '[.env.service.config | .[] | {dockerContainerName:.dockerConfig.dockerImageName,servers:[.allocation[].serverName]}]'

这给了我一个输出:

[
  {
    "dockerContainerName": null,
    "servers": []
  },
  {
    "dockerContainerName": "my_awesome_container",
    "servers": [
      "serverX01",
      "serverX02"
    ]
  },
...
...
]

正如您从结果中看到的,一些服务配置没有 dockerConfig.dockerImageName。我需要限制返回的内容以过滤掉没有 dockerConfig 的内容。我曾尝试使用 if-then-else,但似乎无法使其正常工作。

有什么想法吗?

您可以使用 select 将数组的内容限制为 dockerContainerName 不同于 null 的对象:

jq '.[] | select(.dockerContainerName != null)' <<EOF
[
  {
    "dockerContainerName": null,
    "servers": []
  },
  {
    "dockerContainerName": "my_awesome_container",
    "servers": [
      "serverX01",
      "serverX02"
    ]
  }
]
EOF

{
  "dockerContainerName": "my_awesome_container",
  "servers": [
    "serverX01",
    "serverX02"
  ]
}