首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果数组的长度不是null,则返回数组值

如果数组的长度不是null,则返回数组值
EN

Stack Overflow用户
提问于 2022-03-15 02:01:15
回答 4查看 3.1K关注 0票数 0

我有一个由gitlab管道生成的report.json。看上去:

代码语言:javascript
复制
{"version":"14.0.4","vulnerabilities":[{"id":"64e69d1185ecc48a1943141dcb6dbd628548e725f7cef70d57403c412321aaa0","category":"secret_detection"....and so on

如果没有发现漏洞,那么“漏洞”:[]。我正在尝试开发一个bash脚本来检查漏洞长度是否为空。如果没有,则打印漏洞键的值。可悲的是,我远没有编写天才脚本,所以这是一场斗争。在搜索web以寻找解决方案时,我遇到了jq。看来select()应该做好这项工作。我试过:

代码语言:javascript
复制
jq "select(.vulnerabilities!= null)" report.json

但是它返回了{"version":"14.0.4","vulnerabilities":[{"id":"64e69d1185ecc48a194314...而不是预期的"vulnerabilities":[{"id":"64e69d1185ecc48a194314...

代码语言:javascript
复制
map(select(.vulnerabilities != null)) report.json

返回“没有找到匹配”

除了我在bash和JSON解析方面的0经验之外,您是否介意指出问题所在?)

提前感谢

EN

回答 4

Stack Overflow用户

发布于 2022-03-15 02:37:45

只需使用.筛选器来标识对象vulnerabilities

以下是一些案例

代码语言:javascript
复制
$ jq '.vulnerabilities' <<END
heredoc> {"version":"14.0.4","vulnerabilities":[{"id":"64e69d1185ecc48a1943141dcb6dbd628548e725f7cef70d57403c412321aaa0","category":"secret_detection"}]}
heredoc> END
[
  {
    "id": "64e69d1185ecc48a1943141dcb6dbd628548e725f7cef70d57403c412321aaa0",
    "category": "secret_detection"
  }
]

如果vulnerabilities为空,则jq将返回空。

代码语言:javascript
复制
$ jq '.vulnerabilities' <<END
{"version":"14.0.4","vulnerabilities":null}
END
null

然后,使用管道|,您可以将它更改为您想要的任何输出。

  • 将null改为[]:.vulnerabilities | if . == null then [] else . end
  • 筛选空数组:.vulnerabilities | select(length > 0)

有关jq过滤器的更多信息,您可以阅读jq手册

票数 1
EN

Stack Overflow用户

发布于 2022-03-15 02:37:55

首先,请注意,在JSON世界中,区分[] (空数组)、值0null以及缺少值(例如,对象中缺少键的结果)是很重要的。

在下面的示例中,如果输出不是‘[]’,或者没有其他值,那么输出应该是.vulnerabilities的值:

代码语言:javascript
复制
< sample.json jq '
  select(.vulnerabilities != []).vulnerabilities
'

如果目标是根据返回代码与jq区分两种情况,则可以使用-e命令行选项。

票数 0
EN

Stack Overflow用户

发布于 2022-03-15 08:17:17

  • 假设“打印漏洞键的值”是指项的id字段的值。您可以使用.id检索它,并使用-r选项将其提取为bash。
  • 如果数组不是空的,您需要所有的“键”,使用.[]迭代数组。如果您只想要一个特定的键,比如说第一个键,使用一个基于0的索引:.[0]来处理它。
  • 要检查数组的长度,有一个专用的length内置。但是,由于您的最终目标是提取,您也可以尝试正确地进行操作,使用?操作符抑制潜在的不可达错误,并让您的bash脚本使用-e选项读取适当的退出状态。

然后,bash脚本可以包括以下代码片段

代码语言:javascript
复制
if key=$(jq -re '.vulnerabilities[0].id?' report.json)
then
  # If the array was not empty, $key contains the first key
  echo "There is a vulnerability in key $key."
fi

# or

if keys=$(jq -re '.vulnerabilities[].id?' report.json)
then
  # If the array was not empty, $keys contains all the keys
  for k in $keys
  do echo "There is a vulnerability in key $k."
  done
fi
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71476198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档