arrays - 如何从嵌套(数组?)响应中获取 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
},
对于上述输入,我尝试存储评论:登录和评论:降价
解决方案
使用您的 pastebin JSON 作为输入,并注释掉以 开头的行
//
和以 开头的行read
,您的脚本实际上会运行到完成。由于
comments
是一个数组,.comments[]
因此像您所做的那样编写有点冒险,因为 .comments 可能没有一个元素。.comments[0]
如果这符合您的要求,那么编写的风险会更小。您的脚本调用 jq 五次,但修改它不需要太多努力,以便只调用一次 jq。有关如何完成此操作的一些想法,请参见例如从 JSON 对象中提取 2 个值并使用 jq 和 bash 在循环中用作变量
推荐阅读
- javascript - 如何将 tinyMCE 内容呈现为
- ios - 如何查询整个 Realm 数据库中的特定数据,而不仅仅是特定字段或属性
- amazon-web-services - CloudFormation 模板中不接受安全组
- java - 如何将sql查询条件动态传递给@query作为参数
- android - NumberPickerPreference for androidx-preference kotlin
- android - 如何在 react-native 中从应用程序启动覆盖窗口设置
- php - 如何修复警告:为 foreach() 提供的参数无效
- ruby-on-rails - 同名控制器,一个用于管理员,一个用于用户。管理员不断路由到用户。怎么修?
- ios - iOS Swift Firestore 以及如何避免单例
- linux - 将文本导入 bash 脚本