You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI中使用jq解析含特殊字符节点的JSON报错如何解决?

问题原因

  • 核心报错是因为要访问的JSON键名包含/、;、空格、+等特殊字符,jq默认的.键名语法仅支持纯字母、数字、下划线组成的键名,遇到特殊字符就会触发语法错误。
  • 你原有脚本的管道赋值写法本身也存在问题:变量=值 | 命令的格式不会把变量内容传递给后续命令,管道只会接收前一个命令的标准输出,直接赋值的操作没有输出内容,jq无法拿到输入源。
  • 你尝试用tr做字符串替换的思路不可行,tr工具是单个字符级别的一一替换,无法替换完整字符串,反而会破坏原有JSON结构。

解决方案

直接使用jq的方括号访问语法,用双引号包裹带特殊字符的键名即可,不需要做文本替换。你可以把script部分的代码修改为如下内容:

script:
  - 'RESULTS=$(curl -H "Authorization: Basic `echo -n ${HARBOR_USER}:${HARBOR_PASSWORD} | base64`" -X GET "https://url.to.registry/api/v2.0/projects/project/repositories/repo-name/artifacts/latest?page=1&page_size=10&with_tag=true&with_label=true&with_scan_overview=true&with_signature=true&with_immutable_status=true")'
  - echo "$RESULTS"
  # 用jq方括号语法访问特殊键名,-r参数输出原始字符串(自动去掉结果两端的双引号)
  - STATUS=$(echo "$RESULTS" | jq -r '.scan_overview["application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0"].scan_status')
  - SEVERITY=$(echo "$RESULTS" | jq -r '.scan_overview["application/vnd.scanner.adapter.vuln.report.harbor+json; version=1.0"].severity')
  - echo "Printing the results of the image scanning process on Harbor registry:"
  - echo "status of scan:$STATUS"
  - echo "severity of scan:$SEVERITY"
  - echo "For more information of scan results please visit Harbor registry!"

补充说明

如果担心后续Harbor的API返回的键名版本号会变化,也可以用to_entries的方式取scan_overview下的第一个值,不需要硬编码键名:

# 不硬编码键名的写法,适配任意版本的扫描报告键
STATUS=$(echo "$RESULTS" | jq -r '.scan_overview | to_entries[0].value.scan_status')
SEVERITY=$(echo "$RESULTS" | jq -r '.scan_overview | to_entries[0].value.severity')

内容的提问来源于stack exchange,提问作者Milica Nikolić

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:36:04