飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • JSON

    • JSON 是什么
    • JSON 的六种数据类型
    • 对象(Object)
    • 数组(Array)
    • 字符串(String)
    • 数字(Number)
    • 布尔值和 Null
    • 字符编码与转义
    • JSON 语法规则
    • 综合应用示例
  • JSONPath

    • JSONPath 是什么
    • 根标识符和基本路径
    • 名称选择器
    • 索引选择器
    • 通配符选择器
    • 数组切片选择器
    • 过滤器选择器(上)
    • 过滤器选择器(下)
    • 后代段
    • 函数扩展
    • JSONPath 综合实战

数组切片选择器

什么是数组切片选择器?

数组切片选择器(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] 隔一个取一个。超出范围不报错!

上一页
通配符选择器
下一页
过滤器选择器(上)