根据 JSON 中的嵌套标记获取所有嵌套 url

Get all nested urls based on nested tag in JSON

我在文本文件中输入了以下 Json json.txt

{
   "files":[
      {
         "id":49894894,
         "list":[
            {
               "name":"one",
               "animal_potato_carrot":{
                  "options":[
                     {
                        "id":4989,
                        "url":"https://example.com/text.txt"
                     },
                     {
                        "id":3994,
                        "url":"https://example.com/randomfile.json"
                     }
                  ]
               }
            },
            {
               "name":"two",
               "cat_dog_rabbit":[
                  {
                     "id":4989,
                     "url":"https://example.com/text2.txt"
                  },
                  {
                     "id":3994,
                     "url":"https://example.com/randomfile.json"
                  }
               ]
            },
            {
               "name":"three",
               "animal_potato_carrot":{
                  "options":[
                     {
                        "id":4989,
                        "url":"https://example.com/text3.txt"
                     },
                     {
                        "id":3994,
                        "url":"https://example.com/randomfile.json"
                     }
                  ]
               }
            }
         ]
      }
   ]
}

对于每个 animal_potato_carrotcat_dog_rabbit 嵌套标签,我只想获取 options 列表中的第一个 url(注意它们具有不同的结构)

所以我的输出将是这些块中的前三个 url:

["https://example.com/text.txt", "https://example.com/text2.txt, "https://example.com/text3.txt"]

我试过 jq json.txt -c '.. |."animal_potato_carrot"? | select(. != null)' 但是 return 体内的所有东西,而不仅仅是第一个 url。

编辑:

这两个命令 return url 分别用于 animal_potato_carrotcat_dog_rabbit 但是有没有办法组合这些命令?

jq -c '[..|.animal_potato_carrot?|select(. != null)|.options[0].url]' json.txt
jq -c '[..|.cat_dog_rabbit?|select(. != null)|.[0].url]' json.txt

如果要连接两个数组,可以使用 + 运算符:

jq -c '[..|.animal_potato_carrot?|select(. != null)|.options[0].url] + [..|.cat_dog_rabbit?|select(. != null)|.[0].url]' json.txt

请注意,结果中的项目顺序与您要求的不完全一致,因为首先确定所有 animal_potato_carrot-url,然后确定所有 cat_dog_rabbit-url。

将两个过滤器与 , 结合使用可能最符合您的需求:

jq -c '[..|(.animal_potato_carrot?.options),(.cat_dog_rabbit?)|.[0].url|select(. != null)]' json.txt