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

    • 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 综合实战

索引选择器

什么是索引选择器?

索引选择器(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] 是最后一个。超出范围不报错,非数组返回空。多个索引用逗号分隔!

上一页
名称选择器
下一页
通配符选择器