使用 jq for JSON 为数组中的每个元素输出 object 中的特定键值

我有一个数组:

[
{
"AssetId": 14462955,
"Name": "Cultural Item"
},
{
"AssetId": 114385498,
"Name": "Redspybot"
},
{
"AssetId": 29715011,
"Name": "American Cowboy"
},
{
"AssetId": 98253651,
"Name": "Mahem"
}
]

我想循环遍历这个数组中的每个对象,然后选取名为 AssetId的每个键的值并输出它。 如何在命令行中使用 jq 来完成这项工作?

90896 次浏览

命令行工具 jq写入 STDOUT 和/或 STDERR。如果要编写。AssetId 信息传到 STDOUT,那么一种可能性如下:

jq -r ".[] | .AssetId" input.json

产出:

14462955
114385498
29715011
98253651

一个更强大的咒语应该是: .[] | .AssetId?,但是如果没有名为“ AssetId”的键,那么您的选择将取决于您想要什么。

您也可以通过这个命令执行此操作。

jq ".[].AssetId" input.json

如果数组像我的情况一样

{
"resultCode":0,
"resultMsg":"SUCCESS",
"uniqueRefNo":"111222333",
"list":[
{
"cardType":"CREDIT CARD",
"isBusinessCard":"N",
"memberName":"Bank A",
"memberNo":10,
"prefixNo":404591
},
{
"cardType":"DEBIT CARD",
"isBusinessCard":"N",
"memberName":"Bank A",
"memberNo":10,
"prefixNo":407814
},
{
"cardType":"CREDIT CARD",
"isBusinessCard":"N",
"memberName":"Bank A",
"memberNo":10,
"prefixNo":413226
}
]
}

可以使用下面的 jq 命令获取前缀 No。

jq ".list[].prefixNo" input.json

有关在 jq 上迭代的数组的更具体情况,可以选中 这篇博文

你有两个选择来完成循环。您可以应用 Peak 的令人敬畏的答案,并在其周围包装一个 shell 循环。用要运行的脚本替换 echo。

通过 xargs

$ jq -r ".[] | .AssetId" input.json | xargs -n1 echo  # this would print
14462955
114385498
29715011
98253651

通过原始循环

$ for i in $(jq -r ".[] | .AssetId" input.json)
do
echo $i
done
14462955
114385498
29715011
98253651

使用 map的另一种选择:

jq "map ( .AssetId ) | .[]"

对于你的情况 jq -r '.[].AssetId'应该工作

您还可以使用在线 JQ 解析器: https://jqplay.org/

enter image description here

如果您想循环遍历每个值,那么可以使用以下命令:

for i in $(echo $api_response | jq -r ".[].AssetId")
do
echo echo $i
done