【发布时间】:2018-02-13 09:05:51
【问题描述】:
我正在从 DigitalOcean JSON API 获取液滴列表,并使用 jq map 将响应转换为我需要的信息。
我希望能够根据响应是否包含具有特定值的键,向我的新对象添加一个可选的键值对。
使用select() 时,如果响应不包含匹配项,则会从我的新对象中删除整个液滴条目,而不仅仅是键。
如何过滤单个键而不是整个条目?
详细说明:
单个液滴的响应如下所示:
"id": 12345678,
"name": "my-droplet",
...
"networks": {
"v4": [
{
"ip_address": "123.456.78.90",
"netmask": "255.255.240.0",
"gateway": "123.123.0.1",
"type": "public"
},
{
"ip_address": "10.123.45.67",
"netmask": "255.255.0.0",
"gateway": "10.123.0.1",
"type": "private"
}
],
"v6": []
},
...
我想把它转换成一个形式的对象:
{
"id": 12345678,
"name": "my-droplet",
"public_ip": "123.456.78.90",
"private_ip" "10.123.45.67"
}
所有 Droplet 都有一个公共 IP,但私有 IP 是可选的。
我有这个,它忽略了可选的私有 IP,到目前为止工作正常:
jq '.droplets | map({id: .id, name: .name, status: .status, public_ip: .networks.v4[] | select(.type=="public") | .ip_address})'
但是,一旦我添加了私有 IP,响应中会丢失任何没有的 droplet:
jq '.droplets | map({id: .id, name: .name, status: .status, public_ip: .networks.v4[] | select(.type=="public") | .ip_address, private_ip: .networks.v4[] | select(.type=="private") | .ip_address})'
我想我需要以某种方式使用连接或条件,但我不太清楚语法。
注意:我发现了这个类似的问题,但它不包括更改密钥的名称:denormalizing JSON with jq
【问题讨论】:
-
为了清楚起见:如果没有私有 IP,那么理想情况下,密钥将不存在。我没有多个私有 IP 的情况。