提问者:小点点

如何使用jq迭代对象的JSON数组,并从每个循环中的每个对象获取多个变量


我需要从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”?

谢啦


共1个答案

匿名用户

最好避免多次给jq打电话。例如,考虑:

while read -r name ; do
    read -r url
    echo "$name" "$url"
done < <( curl .... | jq -r '.[] | .name, .commit.url' )

其中curl表示对curl的相关调用。

相关问题