我们如何从下面 JSON 文档中的键具有值的email
条目中获取 ?level
2
预期输出是
[email protected]
请问有什么建议吗?
{
"escalation_policy": {
"on_call": [
{
"level": 2,
"start": "2022-05-25T00:30:00Z",
"end": "2022-05-25T09:30:00Z",
"user": {
"id": "ABOKC",
"name": "Jaavena Dobey",
"email": "[email protected]",
"time_zone": "Tokyo"
}
},
{
"level": 7,
"start": "2022-05-23T01:00:00Z",
"end": "2022-05-30T01:00:00Z",
"user": {
"id": "KLSPSP",
"name": "kosls frank",
"email": "[email protected]",
"time_zone": "Tokyo"
}
},
{
"level": 3,
"start": "2022-05-23T01:00:00Z",
"end": "2022-05-30T01:00:00Z",
"user": {
"id": "SKSPSLSL",
"name": "Smitha Choudhary",
"email": "[email protected]",
"time_zone": "Tokyo"
}
}
]
}
}
答案1
像这样,
- 获取对象数组。
- 选择级别为2的
- 在返回的数组中,打印用户的电子邮件
调用和输出,
$ jq ".escalation_policy.on_call[] | select( .level == 2) | .user.email" test.json
"[email protected]"
答案2
以下内容获取待命人员的电子邮件地址之一,即第一的呼叫级别升级策略等于 2:
jq -r '.escalation_policy.on_call | map(select(.level == 2))[0].user.email' file
您没有专门询问此信息,但以下内容为您提供了值班人员的电子邮件地址,其名称为最低 .level
。我们通过对on_call
数组进行排序并.user.email
从最先排序的条目返回值来实现此目的:
jq -r '.escalation_policy.on_call | sort_by(.level)[0].user.email' file
我们还可以确保当前时间在.start
和.end
时间戳内。为此,我们仅选择相关的待命条目,然后像以前一样对它们进行排序:
jq -r '
.escalation_policy.on_call |
map(select( now > (.start|fromdate) and now < (.end|fromdate) )) |
sort_by(.level)[0].user.email' file
fromdate
我们可以这样做,因为我们很幸运能够拥有与函数期望的格式完全相同的日期jq
。