![jq 获取嵌套对象的属性](https://linux22.com/image/145413/jq%20%E8%8E%B7%E5%8F%96%E5%B5%8C%E5%A5%97%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%B1%9E%E6%80%A7.png)
我有以下结构(完整文件示例在这里):
{
{
"weather": [
{
"advertiser": "Worldwide Forecasts",
"notificationText": "Weather - Check the Weather Now - Weather",
"notificationURL": "http://www.worldwideforecasts.com/b/index.html?aff_sub=NL01R15178755321634q5X2zHqXo1976US&utm_term=weather&utm_campaign=bing&utm_content=new-weather%20-%20Weather%20-%202&utm_medium=Search_SEM&utm_source=7&nlhash=BR6et8ISl5dCdAHF&requestId=NL01R15178755321634q5X2zHqXo1976US",
"uuid": "9f27d258-f9d5-4b19-9f70-291eb9cbab51",
"creativeSetId": "2799cbab-1fa1-4f15-bbc9-c92381dbfc57"
},
{
"advertiser": "Worldwide Forecasts",
"notificationText": "Weather - Check the Weather Now - Weather",
"notificationURL": "http://www.worldwideforecasts.com/b/index.html?aff_sub=NL01R15178755321634q5X2zHqXo1976US&utm_term=weather&utm_campaign=bing&utm_content=new-weather%20-%20Weather%20-%202&utm_medium=Search_SEM&utm_source=7&nlhash=BR6et8ISl5dCdAHF&requestId=NL01R15178755321634q5X2zHqXo1976US",
"uuid": "9f27d258-f9d5-4b19-9f70-291eb9cbab51",
"creativeSetId": "2799cbab-1fa1-4f15-bbc9-c92381dbfc57"
}
]
}
}
像示例一样有几个类别weather
。
我想用来jq
获取所有值的列表,notificationURL
以便我留下所有广告商的网址列表。
我最初想我可以做这样的事情:
cat file.json | jq .[].[].notificationURL
但这行不通。
答案1
您在这里有两个基本选项(带有完整文件):
jq '.categories[][].notificationURL' bundle.json
jq '.categories[] | .[].notificationURL' bundle.json
在第一个中,您[]
连续应用操作两次,在第二个中,您与管道运算符一起组成两个单独的过滤器。我发现使用额外的管道更容易使用和调试,但是对于您的目的来说,这些管道都是相同的。
.[]
通用迭代始终适用于本次迭代的单个输入值,因此它必须是第一的表达式中的元素,并且在其他任何地方都是语法错误,但[]
应用于其左侧的特定值在任何地方都可以。
jq 文档中没有很好地描述您可以abc[]
完全编写而不是只能编写这一事实,但您可以。.[]
您可以将其视为.[]
应用于[]
身份过滤器.
,尽管我认为这实际上是一种特殊情况。
在这种情况下,您可以将其缩小为:
jq '.[][][].notificationURL' bundle.json
它连续三次应用迭代器操作,因为顶级对象中只有一个关键“类别”。