Json 如何确定JQ中是否存在数组

Json 如何确定JQ中是否存在数组,json,if-statement,jq,Json,If Statement,Jq,您好,我有一个curl命令,用于检查api上的一些数据,然后使用jq解析数据以仅获取相关信息 问题是一些数据包含一个称为.result.CVE_Items[].configurations.nodes[].children[]的特定类,但其他数据没有。因此,我试图编写一个if、elif和else语句来解析数据。我正在试图找出如何放置一个elif语句来检查此类是否存在.result.CVE_Items[].configurations.nodes[].children[],以及是否存在该类以便查询

您好,我有一个curl命令,用于检查api上的一些数据,然后使用jq解析数据以仅获取相关信息

问题是一些数据包含一个称为
.result.CVE_Items[].configurations.nodes[].children[]
的特定类,但其他数据没有。因此,我试图编写一个if、elif和else语句来解析数据。我正在试图找出如何放置一个elif语句来检查此类是否存在
.result.CVE_Items[].configurations.nodes[].children[]
,以及是否存在该类以便查询数据

下面是两个命令,其中一个包含类,另一个不包含类,并导致错误:


#第一个命令起作用:具有类
curl-shttps://services.nvd.nist.gov/rest/json/cve/1.0/CVE-2020-12389 |jq-r'如果.totalResults==1,那么{CVE:.result.CVE_Items[].CVE.CVE_data_meta.ID,描述:.result.CVE_Items[].CVE.Description.Description.Description_data[].value,“CVSS V3分数”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.baseSeverity,“攻击向量”;“所需特权”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.privilegesRequired,“用户交互”:.result.CVE_项[]。impact.baseMetricV3.cvssV3.userInteraction,“影响分数”:.result.CVE_项[]。impact.baseMetricV3.impactScore,“受影响的产品”:[.result.CVE_项[]。配置。节点[]。子项[]。cpe_匹配[]。cpe23Uri]}其他。|{结果:。消息}结束'
输出:
{
“CVE”:“CVE-2020-12389”,
“说明”:“Firefox内容进程未充分锁定访问控制,这可能导致沙盒逃逸。*注意:此问题仅影响Windows操作系统上的Firefox。*。此漏洞影响Firefox ESR<68.8和Firefox<76。”,
“CVSS V3分数”:“关键”,
“攻击向量”:“网络”,
“所需特权”:“无”,
“用户交互”:“无”,
“影响分数”:6,
“受影响产品”:[
“cpe:2.3:a:mozilla:firefox:**”,
“cpe:2.3:a:mozilla:firefox\u esr:*”,
“cpe:2.3:o:microsoft:windows:-:*:*:*:*:*:*:*:*:*:*”
]
}
#第二个命令如上所述,但不同的数据输出,不包含类,因此出错。
curl-shttps://services.nvd.nist.gov/rest/json/cve/1.0/CVE-2020-0796 |jq-r'如果.totalResults==1,那么{CVE:.result.CVE_Items[].CVE.CVE_data_meta.ID,描述:.result.CVE_Items[].CVE.Description.Description.Description_data[].value,“CVSS V3分数”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.baseSeverity,“攻击向量”;“所需特权”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.privilegesRequired,“用户交互”:.result.CVE_项[]。impact.baseMetricV3.cvssV3.userInteraction,“影响分数”:.result.CVE_项[]。impact.baseMetricV3.impactScore,“受影响的产品”:[.result.CVE_项[]。配置。节点[]。子项[]。cpe_匹配[]。cpe23Uri]}其他。|{结果:。消息}结束'
输出:
jq:错误(位于:0):无法迭代null(null)
#错误主要发生在受影响的产品上。。。。当您删除.children[]时,它会起作用
curl-shttps://services.nvd.nist.gov/rest/json/cve/1.0/CVE-2020-0796 |jq-r'如果.totalResults==1,那么{CVE:.result.CVE_Items[].CVE.CVE_data_meta.ID,描述:.result.CVE_Items[].CVE.Description.Description.Description_data[].value,“CVSS V3分数”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.baseSeverity,“攻击向量”;“所需特权”:.result.CVE_Items[].impact.baseMetricV3.cvssV3.privilegesRequired,“用户交互”:.result.CVE_项[]。impact.baseMetricV3.cvssV3.userInteraction,“影响分数”:.result.CVE_项[]。impact.baseMetricV3.impactScore,“受影响的产品”:[.result.CVE_项[]。配置。节点[]。cpe_匹配[]。cpe23Uri]}其他。|{结果:。消息}结束'
输出:
{
“CVE”:“CVE-2020-0796”,
“说明”:“Microsoft Server Message Block 3.1.1(SMBv3)协议处理某些请求的方式中存在远程代码执行漏洞,也称为“Windows SMBv3客户端/服务器远程代码执行漏洞”。”,
“CVSS V3分数”:“关键”,
“攻击向量”:“网络”,
“所需特权”:“无”,
“用户交互”:“无”,
“影响分数”:6,
“受影响产品”:[
“cpe:2.3:o:microsoft:windows_10:1903:**”,
“cpe:2.3:o:microsoft:windows_10:1909:**”,
“cpe:2.3:o:microsoft:windows\u server\u 2016:1903:**”,
“cpe:2.3:o:microsoft:windows\u server\u 2016:1909:**”
]
}
我尝试过has(“children”)和has(“children[]),但没有任何效果,我真的没有任何线索,我已经检查了在解析之前检查元素时提出的所有github问题,还对stackoverflow进行了搜索。我也检查了文件。我希望它在一个命令中首先检查totalResults==1和has(children)==false以查询信息elif totalResults==1和has(children)==true以查询信息,否则打印出错误消息,这意味着数据不可用

好心协助

谢谢


\n00b

一个油嘴滑舌的答案是使用以下if/then/else结构:

if .result.CVE_Items[].configurations.nodes[] | has("children")
then ...
else ...
end
但是,每个数组的长度都等于1,这意味着什么呢?或者
节点
数组中的项是JSON对象

因此,或许最好写下以下内容:

.result.CVE_Items[0].configurations.nodes[0] as $node
| if ($node | ( type == "object" and has("children") ))
  then ...
  else ...
  end
但查询的其余部分也存在同样的问题,这不仅会产生错误,还会产生不必要的组合爆炸

因此,您可能应该做的是在整个过程中引入jq变量,以确保您只选择您真正想要的项目,如以下部分所示

一个小提示:你可以简单地写E来代替(.| E)

例子 所以@p
    if .totalResults == 1 
    then .result.CVE_Items[] 
    | .cve.CVE_data_meta.ID as $ID
    | .cve.description.description_data[].value as $value
    | .configurations.nodes[] as $node
    | if $node | (type == "object" and has("children"))
      then .impact.baseMetricV3
      |  {CVE: $ID,
          Description: $value, 
          "CVSS V3 Score":  .cvssV3.baseSeverity,
          "Attack Vector":  .cvssV3.attackVector,
          "Privileges Required": .cvssV3.privilegesRequired,
          "User Interaction": .cvssV3.userInteraction,
          "Impact Score": .impactScore,
          "Products Affected": [$node.children[].cpe_match[].cpe23Uri]}
      else {Results: .message} 
      end
    else {Results: .message} 
    end