jq操作指南:何时使用点操作符,何时不使用?
jq中点操作符的使用时机与示例操作详解
我来帮你理清楚jq里点操作符的使用逻辑,再结合你给出的JSON示例,一步步拆解常见的选择操作~
一、何时用点操作符,何时不用?
必须用点的核心场景
jq的过滤器默认是针对当前输入的JSON数据,所以当你要访问当前输入对象的属性时,必须以点(.)开头:
- 访问顶层对象的直接属性:比如想取JSON里的
data属性,就得写.data(直接写data会被当成未定义的变量,报错) - 访问嵌套层级的属性:比如
data下的search,要写成.data.search;再往下的repositoryCount就是.data.search.repositoryCount - 访问数组元素的属性:比如数组里每个元素的
node属性,要写成.edges[].node(这里[]是展开数组,前面的.edges先定位到数组)
如果属性名包含特殊字符(空格、连字符、数字开头),那得用方括号加引号包裹属性名,但点还是不能少:
比如属性名是repo-count,访问方式是.["repo-count"]或者.data.search["repo-count"]
不需要用点的场景
- 使用jq内置函数:比如
length(返回数组长度/对象属性个数)、keys(返回对象的属性名数组),直接写函数名即可。比如想知道edges数组有多少元素,写成.data.search.edges | length - 数组展开/索引操作:当你已经通过点定位到数组后,用
[]展开所有元素,或者[0]取第一个元素,这里[]/[0]前面不需要额外加。比如.data.search.edges[] - 变量引用:如果之前定义了变量(比如
$repoName = .node.name),直接用变量名即可 - 字面量值:直接写字符串、数字等字面量,比如
jq '"hello"'会输出"hello"
二、针对你的JSON示例的具体选择操作
先把你的示例JSON简化一下,方便对照:
{ "data": { "search": { "repositoryCount": 24, "edges": [ { "node": { "name": "leumi-leumicard-bank-data-scraper", "url": "https://github.com/Urigo/leumi-leumicard-bank-data-scraper", "description": "Open bank data for Leumi bank and Leumi card credit card" } }, { "node": { "name": "puppeteer-demo", "url": "https://github.com/xJkit/puppeteer-demo", "description": "A demo for website scrapping by my puppet :>" } } ] } } }
下面是常用的操作命令:
- 获取顶层的
data对象
jq '.data' input.json
输出整个data下的嵌套结构
- 获取仓库总数
repositoryCount
jq '.data.search.repositoryCount' input.json
输出:24
- 展开所有
edges数组元素
jq '.data.search.edges[]' input.json
会逐个输出数组里的每个edge对象(包含node属性的那个)
- 提取所有仓库的名称
jq '.data.search.edges[].node.name' input.json
输出两行结果:
"leumi-leumicard-bank-data-scraper" "puppeteer-demo"
- 获取第一个仓库的URL
jq '.data.search.edges[0].node.url' input.json
输出第一个仓库的URL字符串
- 自定义输出结构(比如只保留名称和描述)
用管道符|把前面的结果传给下一个过滤器,重新组合对象:
jq '.data.search.edges[] | {仓库名称: .node.name, 描述: .node.description}' input.json
输出:
{ "仓库名称": "leumi-leumicard-bank-data-scraper", "描述": "Open bank data for Leumi bank and Leumi card credit card" } { "仓库名称": "puppeteer-demo", "描述": "A demo for website scrapping by my puppet :>" }
内容的提问来源于stack exchange,提问作者xpt
相关产品推荐
相关产品推荐

