json - 使用 jq 验证根级元素的存在
问题描述
给定如下 JSON 结构,我想测试sys/
顶级键是否存在。
{
"abc/": {
"uuid": "fd"
},
"sys/": {
"uuid": "id2"
}
}
我尝试了各种构造,例如jq "sys/"
orjq "sys/.uuid"
但我得到编译错误和/或错误,例如“jq: error: sys/0 is not defined at , line 1:”
请注意,正确返回的结果代码 ( $?
)以反映实际结果非常重要(因为这是在配置管理测试中使用的)。jq
解决方案
您只需要使用has
根据提到的键的存在返回布尔值的属性
jq 'has("sys/")'
请注意,您可以自定义返回booljq
字符串甚至.null
0
1
如果您希望jq
在 shell 条件语句中使用 的结果,可以使其返回退出代码。有一个选项支持这一点。从文档
-e / --exit-status:
如果最后一个输出值不是or ,如果最后一个输出值是or ,或者没有产生有效结果,则将退出状态设置为
jq
。0
false
null
1
false
null
4
所以在你给定的 JSON 上使用它
jq -e 'has("sys/")' json > /dev/null
echo $?
0
但是对于不存在的密钥sys1
,它会发出
jq -e 'has("sys1/")' json > /dev/null
echo $?
1
请注意,> /dev/null
抑制应用过滤器时抛出的标准输出,这是布尔字符串值。如果您的jq
版本不支持该选项,或者您正在寻找另一种方法来执行此操作,您可以直接匹配从has()
过滤器返回的字符串,而不是评估退出代码,即
if [ $(jq 'has("sys/")' json) = "true" ]; then
printf '%s\n' 'key present'
fi
推荐阅读
- python - 如何使用 Python 创建电池通知器
- mongodb - 用通用键结构过滤掉嵌套数组中的文档(Mongo)
- android - mvc / mvp 模式中是否允许使用任何“helperclass”?
- azure - Azure 应用程序网关指向 Azure CDN?
- javascript - 来自最后一个反斜杠字符的 Javascript 子字符串
- c# - EF Core 计算属性的可选加载
- r - 你好。我是 R 的新手,并且在使用 for 和 while 循环编写我的函数方面非常挣扎。有人可以告诉我 qs 的 for 和 while 循环吗?
- ios - 访问通过 Appium 上传到 iOS 应用沙箱的文件
- google-bigquery - 通过特定 event_params.key 查询
- html - 裁剪列表或图像表格以适应屏幕的高度和宽度