首页 > 解决方案 > 如何从嵌套(数组?)响应中获取 JQ 名称/值对?

问题描述

我正在遍历一个 JSON 响应文件并成功存储每次迭代的名称/值对。我失败了,因为我没有正确调整过滤器以访问嵌套数组的经验,这是响应的一部分。我需要一些指导来设置正确的 JQ 过滤器

目的是循环浏览 WEB-API curl 命令的响应。在我的案例中,SonarQube 中创建的问题基于特定评论的存在,是否创建 JIRA 票证(不是示例的一部分)。

#!/usr/bin/env bash
SQIssues=$(curl --user user:pass https://sonarqube.domain.nl/api/issues/search?additionalFields=comments&statuses=OPEN&types=BUG&branch=master&componentKeys=project)
for k in $(jq '.issues | keys | .[]' <<< "$SQIssues"); do
        key=$(jq -r ".issues[$k].key" <<< "$SQIssues");
        status=$(jq -r ".issues[$k].status" <<< "$SQIssues");
        // TWO LINES BELOW NOT-OK
        comuser=$(jq -r ".issues[$k] | .comments[].login" <<< "$SQIssues");
        com=$(jq -r ".issues[$k] .comments[].markdown" <<< "$SQIssues");
        echo key="$key" and status="$status" and comment="$com" by user="$comuser";
        read -n 1 -s -r -p "Press any key to continue";
done

响应(正确抓取KEY和STATUS):

Press any key to continuekey=AWySAdI5-U8iL73rOJWx; and status=OPEN and comment= by user=
Press any key to continuekey=AWyMy9EK-U8iL73rOI-c; and status=OPEN and comment= by user=
Press any key to continuekey=AWyMy9Er-U8iL73rOI-d; and status=OPEN and comment= by user=

我成功地获得了特定级别的 N/V 对。我无法从与“key”或“status”处于同一级别的“comments”数组中获取 N/V 对

好的 =

ISSUES
-- KEY=xx
-- STATUS=xx

NOK =(评论下的 n/v,更深一层)

ISSUES
-- Comments
--- KEY=xx
--- MARKDOWN=xx

我假设“评论”是一个数组。我尝试在循环期间存储例如降价值。

我正在尝试使用的示例 SQ 响应主体(示例输入)“ $SQIssues ”这是完整响应的摘要,发布在 pastebin 上:https ://pastebin.com/MNubhfWM

{
key: "AWtQSFvOvmpNDcmJ7zeY",
rule: "javascript:S930",
severity: "CRITICAL",
component: "path/to/file.js",
project: "project-name",
line: 350,
hash: "9a8c7b5d9121757995511514602d1fd3",
textRange: {},
flows: [],
status: "OPEN",
message: "This function expects no arguments, but 1 was provided.",
effort: "10min",
debt: "10min",
author: "user@domain.nl",
tags: [],
comments: [
{
key: "AWxxXwIoRqbStspvKH2w",
login: "lmolenaar",
htmlText: "<a href="https://jira.domain.nl/browse/xxx-30093" target="_blank">https://jira.domain.nl/browse/xxx-30093</a>",
markdown: "https://jira.domain.nl/browse/xxx-30093",
updatable: true,
createdAt: "2019-08-08T15:15:47+0200"
}
],
creationDate: "2019-06-04T11:33:28+0200",
updateDate: "2019-08-08T15:15:47+0200",
type: "BUG",
organization: "default-organization",
fromHotspot: false
},

对于上述输入,我尝试存储评论:登录和评论:降价

标签: arraysjsonbashnestedjq

解决方案


  1. 使用您的 pastebin JSON 作为输入,并注释掉以 开头的行//和以 开头的行read,您的脚本实际上会运行到完成。

  2. 由于comments是一个数组,.comments[]因此像您所做的那样编写有点冒险,因为 .comments 可能没有一个元素。.comments[0]如果这符合您的要求,那么编写的风险会更小。

  3. 您的脚本调用 jq 五次,但修改它不需要太多努力,以便只调用一次 jq。有关如何完成此操作的一些想法,请参见例如从 JSON 对象中提取 2 个值并使用 jq 和 bash 在循环中用作变量


推荐阅读