索引选择器
什么是索引选择器?
索引选择器(Index Selector) 通过数字索引来选择数组中的元素。
它就像你按座位号找人:"我要找第 3 排第 2 个座位的人。"
基本语法
$[0] // 选择第 1 个元素(索引从 0 开始)
$[1] // 选择第 2 个元素
$[-1] // 选择最后 1 个元素(负数索引)
⚠️ 重要:JSONPath 的数组索引从 0 开始,不是从 1 开始!
索引从 0 开始
这是新手最容易混淆的地方:
| 索引 | 对应位置 | 说明 |
|---|---|---|
0 | 第 1 个 | 第一个元素 |
1 | 第 2 个 | 第二个元素 |
2 | 第 3 个 | 第三个元素 |
n | 第 n+1 个 | 第 n+1 个元素 |
示例
{
"members": ["航仔", "翼王", "凌叔", "空少", "风速"]
}
| JSONPath | 结果 | 说明 |
|---|---|---|
$.members[0] | "航仔" | 第 1 个 |
$.members[1] | "翼王" | 第 2 个 |
$.members[2] | "凌叔" | 第 3 个 |
$.members[4] | "风速" | 第 5 个 |
$.members[5] | (空) | 超出范围,不报错 |
负数索引:从末尾倒数
JSONPath 支持负数索引,从数组末尾开始数:
| 索引 | 对应位置 | 说明 |
|---|---|---|
-1 | 最后 1 个 | 倒数第 1 个 |
-2 | 倒数第 2 个 | 倒数第 2 个 |
-3 | 倒数第 3 个 | 倒数第 3 个 |
示例
{
"members": ["航仔", "翼王", "凌叔", "空少", "风速"]
}
| JSONPath | 结果 | 说明 |
|---|---|---|
$.members[-1] | "风速" | 最后一个 |
$.members[-2] | "空少" | 倒数第二个 |
$.members[-5] | "航仔" | 倒数第五个 = 第一个 |
$.members[-6] | (空) | 超出范围,不报错 |
💡 负数索引非常实用!比如你想找"最后一个部门"、"最新一条记录",直接用
-1就行。
索引超出范围不报错
如果索引超出了数组范围,JSONPath 不会报错,而是返回空结果。
{
"members": ["航仔", "翼王"]
}
| JSONPath | 结果 | 说明 |
|---|---|---|
$.members[0] | "航仔" | 正常 |
$.members[1] | "翼王" | 正常 |
$.members[2] | (空) | 超出范围,不报错 |
$.members[100] | (空) | 超出范围,不报错 |
$.members[-3] | (空) | 超出范围,不报错 |
💡 这个特性让 JSONPath 查询很安全——不会因为数据比预期少而崩溃。
索引选择器只能用于数组
索引选择器对非数组值不起作用:
{
"company": "广州飞翔科技",
"members": ["航仔", "翼王"]
}
| JSONPath | 结果 | 说明 |
|---|---|---|
$.company[0] | (空) | company 是字符串,不是数组 |
$.members[0] | "航仔" | members 是数组,正常返回 |
实战:飞翔科技员工列表查询
示例 JSON
{
"departments": [
{
"name": "技术部",
"members": [
{"name": "航仔", "position": "后端开发"},
{"name": "翼王", "position": "架构师"},
{"name": "凌叔", "position": "运维工程师"},
{"name": "空少", "position": "前端开发"},
{"name": "风速", "position": "算法工程师"}
]
},
{
"name": "产品部",
"members": [
{"name": "图妹", "position": "产品经理"},
{"name": "星宇", "position": "产品助理"},
{"name": "靓晴", "position": "UI设计师"}
]
}
]
}
查询练习
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 第一个部门 | $.departments[0] | 技术部对象 |
| 第二个部门 | $.departments[1] | 产品部对象 |
| 技术部第1人 | $.departments[0].members[0] | {"name":"航仔","position":"后端开发"} |
| 技术部第1人姓名 | $.departments[0].members[0].name | "航仔" |
| 技术部第2人职位 | $.departments[0].members[1].position | "架构师" |
| 技术部最后1人 | $.departments[0].members[-1] | {"name":"风速","position":"算法工程师"} |
| 技术部最后1人姓名 | $.departments[0].members[-1].name | "风速" |
| 产品部第1人 | $.departments[1].members[0] | {"name":"图妹","position":"产品经理"} |
| 产品部第3人职位 | $.departments[1].members[2].position | "UI设计师" |
多个索引组合查询
一个子段里可以写多个索引,用逗号分隔:
{
"members": ["航仔", "翼王", "凌叔", "空少", "风速"]
}
$.members[0, 2, 4]
结果:
"航仔"(索引 0)"凌叔"(索引 2)"风速"(索引 4)
💡 这相当于"我要第 1 个、第 3 个和第 5 个"。
常见错误
| 错误写法 | 问题 | 正确写法 |
|---|---|---|
$.members[1] | 以为索引从 1 开始 | $.members[0] 才是第一个 |
$.company[0] | 对字符串用索引 | 字符串不是数组 |
$.members[0]name | 缺少点或括号 | $.members[0].name |
$.members(0) | 用了圆括号 | 数组用方括号 $.members[0] |
一句话总结
提示
索引选择器用 [n] 选数组元素,索引从 0 开始。[0] 是第一个,[-1] 是最后一个。超出范围不报错,非数组返回空。多个索引用逗号分隔!