根据 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_carrot
或 cat_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_carrot
和 cat_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
我在文本文件中输入了以下 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_carrot
或 cat_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_carrot
和 cat_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