数组切片选择器
什么是数组切片选择器?
数组切片选择器(Slice Selector) 用来从数组中选择一段连续的元素,就像切蛋糕一样切出一块。
基本语法
$[start:end:step]
| 参数 | 说明 | 默认值 |
|---|---|---|
start | 起始索引(包含) | 0(正步长)或 len-1(负步长) |
end | 结束索引(不包含) | 数组长度 len(正步长)或 -len-1(负步长) |
step | 步长,每次跳几个 | 1 |
💡 语法灵感来自 Python 的切片,也类似 JavaScript 的
Array.prototype.slice。
基础切片示例
示例数组
{
"letters": ["a", "b", "c", "d", "e", "f", "g"]
}
常用切片
| JSONPath | 结果 | 说明 |
|---|---|---|
$.letters[1:3] | "b"、"c" | 索引 1 到 3(不含),即第 2、3 个 |
$.letters[0:2] | "a"、"b" | 索引 0 到 2(不含),即第 1、2 个 |
$.letters[:2] | "a"、"b" | 省略 start,默认从 0 开始 |
$.letters[5:] | "f"、"g" | 省略 end,默认到末尾 |
$.letters[:] | "a"~"g" | 全部元素 |
图解切片
索引: 0 1 2 3 4 5 6
元素: a b c d e f g
↑ ↑
start=1 end=3
结果: b c
⚠️
end是不包含的![1:3]只取索引 1 和 2,不取 3。
带步长的切片
步长为正数:正向选取
{
"letters": ["a", "b", "c", "d", "e", "f", "g"]
}
| JSONPath | 结果 | 说明 |
|---|---|---|
$.letters[0:7:2] | "a"、"c"、"e"、"g" | 从 0 开始,每隔 2 个取一个 |
$.letters[1:6:2] | "b"、"d"、"f" | 从 1 开始,每隔 2 个取一个 |
$.letters[::2] | "a"、"c"、"e"、"g" | 从头到尾,步长 2 |
图解步长
索引: 0 1 2 3 4 5 6
元素: a b c d e f g
↑ ↑ ↑ ↑
step=2 step=2 step=2 step=2
[0:7:2] 结果: a, c, e, g
负步长:反向选取
当 step 为负数时,切片从后往前取元素。
| JSONPath | 结果 | 说明 |
|---|---|---|
$.letters[::-1] | "g"、"f"、"e"、"d"、"c"、"b"、"a" | 全部元素,反向 |
$.letters[5:1:-1] | "f"、"e"、"d"、"c" | 从 5 到 1(不含),反向 |
$.letters[5:1:-2] | "f"、"d" | 从 5 到 1(不含),反向,步长 2 |
💡
[::-1]是最常用的反向切片,相当于把数组倒过来!
切片的安全特性
切片和索引一样,超出范围不报错:
| JSONPath | 结果 | 说明 |
|---|---|---|
$.letters[0:100] | 全部元素 | end 超出范围,取到末尾为止 |
$.letters[10:20] | (空) | start 超出范围,返回空 |
$.letters[-10:2] | "a"、"b" | start 负数超出范围,从 0 开始 |
实战:飞翔科技员工分页查询
示例 JSON
{
"techMembers": [
{"name": "航仔", "position": "后端开发"},
{"name": "翼王", "position": "架构师"},
{"name": "凌叔", "position": "运维工程师"},
{"name": "空少", "position": "前端开发"},
{"name": "风速", "position": "算法工程师"}
]
}
查询练习
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 前 2 人 | $.techMembers[:2] | 航仔、翼王 |
| 第 2~3 人 | $.techMembers[1:3] | 翼王、凌叔 |
| 后 2 人 | $.techMembers[-2:] | 空少、风速 |
| 除第 1 人外全部 | $.techMembers[1:] | 翼王、凌叔、空少、风速 |
| 所有人倒序 | $.techMembers[::-1] | 风速、空少、凌叔、翼王、航仔 |
| 每隔 1 人取一个 | $.techMembers[::2] | 航仔、凌叔、风速 |
| 前 3 人姓名 | $.techMembers[:3].name ❌ | 语法不支持 |
| 前 3 人姓名 | $.techMembers[:3][*].name | 航仔、翼王、凌叔 |
⚠️ 注意:
$.techMembers[:3].name这种写法在标准 JSONPath 中不支持,需要用过滤器或其他方式处理。
常见错误
| 错误写法 | 问题 | 正确写法 |
|---|---|---|
$.arr[1-3] | 用了减号连接 | $.arr[1:3] |
$.arr[1:3:0] | 步长为 0 | 步长为 0 时返回空 |
$.arr(1:3) | 用了圆括号 | $.arr[1:3] |
$.obj[1:3] | 对对象用切片 | 切片只能用于数组 |
一句话总结
提示
切片 [start:end:step] 从数组切一段。start 包含,end 不包含,step 默认 1。[::-1] 倒序,[::2] 隔一个取一个。超出范围不报错!