首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在bash中使用jq构建一个json

在bash中使用jq构建一个json
EN

Stack Overflow用户
提问于 2021-06-24 08:01:21
回答 1查看 77关注 0票数 0

我希望从从另一个json获取的变量中创建一个新的json文件。我是jq的初学者。

代码语言:javascript
运行
复制
while read -r id name name_with_namespace
do
   echo "$id : $name"
   vivariables=$(curl --progress-bar -X GET --header "Content-Type: application/json" --header "Authorization: bearer ${token}" "$GitlabServerURL/api/v4/projects/$id/variables")
   JSON_STRING=$( jq -n \
                  --arg id "$id" \
                  --arg project_name "$name" \
                  --arg project_path "$name_with_namespace" \
                  --arg project_variables "$variables" \
                  '{id: $id, project_name: $project_name, project_path: $project_path, project_variables: $project_variables}' )
   echo $JSON_STRING >> variables_projects.json
done < <(jq -r '.[] | "\(.id) \(.name) \(.name_with_namespace) "' < projects.json)

我用脚本恢复的部分数据的示例:

代码语言:javascript
运行
复制
{ "id": "200", "project_name": "spring-boot-remove", "project_path": "agpm / templates / ansible / spring-boot-remove", "project_variables": "[]" }
{ "id": "199", "project_name": "agpm-gitleaks", "project_path": "DevSecOps / agpm-gitleaks", "project_variables": "[]" }
{ "id": "198", "project_name": "haproxy", "project_path": "Infra / Projets / nexo / haproxy", "project_variables": "[]" }

我希望得到的是:

代码语言:javascript
运行
复制
[{ "id": "200", "project_name": "spring-boot-remove", "project_path": "agpm / templates / ansible / spring-boot-remove", "project_variables": "[]" },
{ "id": "199", "project_name": "agpm-gitleaks", "project_path": "DevSecOps / agpm-gitleaks", "project_variables": "[]" },
{ "id": "198", "project_name": "haproxy", "project_path": "Infra / Projets / nexo / haproxy", "project_variables": "[]" }]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-24 13:36:02

这是因为在bash循环中逐行生成JSON对象。我认为实现目标的最快方法是处理输出文件(variables_projects.json)。

代码语言:javascript
运行
复制
jq -s . variables_projects.json | sponge variables_projects.json

输出

代码语言:javascript
运行
复制
[
  {
    "id": "200",
    "project_name": "spring-boot-remove",
    "project_path": "agpm / templates / ansible / spring-boot-remove",
    "project_variables": "[]"
  },
  {
    "id": "199",
    "project_name": "agpm-gitleaks",
    "project_path": "DevSecOps / agpm-gitleaks",
    "project_variables": "[]"
  },
  {
    "id": "198",
    "project_name": "haproxy",
    "project_path": "Infra / Projets / nexo / haproxy",
    "project_variables": "[]"
  }
]

对于紧凑的输出,添加-c选项:

代码语言:javascript
运行
复制
jq -cs . variables_projects.json | sponge variables_projects.json

输出:

代码语言:javascript
运行
复制
[{"id":"200","project_name":"spring-boot-remove","project_path":"agpm / templates / ansible / spring-boot-remove","project_variables":"[]"},{"id":"199","project_name":"agpm-gitleaks","project_path":"DevSecOps / agpm-gitleaks","project_variables":"[]"},{"id":"198","project_name":"haproxy","project_path":"Infra / Projets / nexo / haproxy","project_variables":"[]"}]

从医生那里:

--slurp/-s:不是为输入中的每个JSON对象运行过滤器,而是将整个输入流读入一个大数组中,只运行一次。-紧凑-输出/ -c:默认情况下,jq漂亮-打印JSON输出。使用此选项将导致更紧凑的输出,方法是将每个JSON对象放在一行上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68111789

复制
相关文章

相似问题

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