我需要从JSON属性中获取变量。
JSON数组看起来像这样(GitHub存储库标签API),这是我从curl请求中获得的。
[
{
"name": "my-tag-name",
"zipball_url": "https://api.github.com/repos/path-to-my-tag-name",
"tarball_url": "https://api.github.com/repos/path-to-my-tag-name-tarball",
"commit": {
"sha": "commit-sha",
"url": "https://api.github.com/repos/path-to-my-commit-sha"
},
"node_id": "node-id"
},
{
"name": "another-tag-name",
"zipball_url": "https://api.github.com/repos/path-to-my-tag-name",
"tarball_url": "https://api.github.com/repos/path-to-my-tag-name-tarball",
"commit": {
"sha": "commit-sha",
"url": "https://api.github.com/repos/path-to-my-commit-sha"
},
"node_id": "node-id"
},
]
在我的实际JSON中,有100个类似的对象。
当我循环每一个变量时,我需要获取名称和提交URL,然后在进入下一个对象并重复之前,使用这两个变量执行更多操作。
我试过(有和没有-r)
tags=$(curl -s -u "${GITHUB_USERNAME}:${GITHUB_TOKEN}" -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/path-to-my-repository/tags?per_page=100&page=${page}")
for row in $(jq -r '.[]' <<< "$tags"); do
tag=$(jq -r '.name' <<< "$row")
# I have also tried with the syntax:
url=$(echo "${row}" | jq -r '.commit.url')
# do stuff with $tag and $url...
done
但我会遇到如下错误:
解析错误:第2行第0列EOF处未完成的JSON术语jq:error(at:1):无法使用字符串“name”索引字符串}解析错误:第1行第1列的“}”不匹配
从终端输出来看,它似乎试图以一种奇怪的方式解析$row
,试图获取。每个子字符串的名称
?不确定。
我假设$(jq'.[]'的输出
在进入下一个对象之前,如何获取每个对象的“.name”和“.commit.url”?
谢啦
最好避免多次给jq打电话。例如,考虑:
while read -r name ; do
read -r url
echo "$name" "$url"
done < <( curl .... | jq -r '.[] | .name, .commit.url' )
其中curl代码>表示对curl的相关调用。