使用jq为JSON中的每个元素输出对象中特定键的值

85

我有一个数组:

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

我想循环遍历这个数组中的每个对象,并挑选出名为AssetId的每个键的值并输出。如何使用jq在命令行中实现这一点?


请明确一下这是一个[jq]问题还是[jquery]问题。它们并不相同,不应该混淆使用... 您的问题在标记和提问方式上非常模糊。 - Jeff Mercado
5个回答

103

命令行工具jq会写入标准输出和/或标准错误流。如果你想将.AssetId信息写入标准输出,则可以按以下方式操作:

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

输出:

14462955
114385498
29715011
98253651

更强壮的咒语将是: .[] | .AssetId? 但是你的选择将取决于如果没有名为"AssetId"的键,你想要什么。


2
谢谢,非常有帮助的答案! - Zimbabwe Elephant
注意:我该如何将它们分别传递给一个函数? - Zimbabwe Elephant
@ZimbabweElephant - 请查看更新。如果您仍然遇到问题,请更具体地说明,或根据需要创建一个新的SO Q。 - peak
这只是给出一个字符串输出。你不能把它放在bash的循环中。 - Craig
@Craig - 问题中没有提到bash for循环,但如果有人想将所选值提供给bash for循环,则通常的方法是使用习语:.... | while read -r line ; do ... ; done - peak
显示剩余3条评论

27

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

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命令获取前缀编号。

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

如果您想要了解有关在jq上迭代数组的更具体案例,可以查看此博客文章


7

您有几种选择来执行循环本身。您可以采用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

4

使用 map 的另一种选择:

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

3

对于您的情况,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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接