我使用以下 jq 片段从值数组中提取键:
jq '[.[].refreshToken | select(. != null)] | unique]'
我如何断言只返回了 1 个元素?如果在结果数组中找到超过 1 个元素,我希望返回非 0 状态代码/否则结果 JSON 数组包含 1 个元素。
[{
"tokenType":"Bearer",
"expiresIn":3599,
"expiresOn":"2021-09-28 17:41:15.929902",
"resource":"https://management.core.windows.net/",
"accessToken":"lkZXIuZ2mn_A",
"refreshToken":"0.AYIAGNEIQ9HtAEOq4v1k",
"oid":"0000-ea77-4abe-961b-0000",
"userId":"[email protected]",
"isMRRT":true,
"_clientId":"0000-0000-0000-0000",
"_authority":"https://login.microsoftonline.com/common"
}]
答案1
使用其(或) 命令行选项,可以使jq
实用程序以与最后评估值相对应的退出状态退出。--exit-status
-e
jq -r -e '[.[] | select(.refreshToken != null)] | unique | if length == 1 then .[].refreshToken else empty end' file
如果上面表达式中计算的最后一条语句为 true、非空、非 null,则 的退出状态jq
将为零;否则,它将非零。
评论显示,我们所寻求的是refreshToken
数据,但前提是它是唯一的。你可以这样做
jq -r -e '[.[].refreshToken // empty] | unique | if length == 1 then .[] else empty end' file
答案2
解决了:jq -r '([.[].refreshToken | select(. != null)] | unique) as $r | if $r | length == 1 then $r | .[] else null end'