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

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

根标识符和基本路径

根标识符 $

什么是根标识符?

$ 是 JSONPath 的根标识符,表示"从 JSON 数据的根节点开始"。

每个 JSONPath 查询(除了过滤器表达式内部的子查询)都必须以 $ 开头。

类比

想象一栋大楼:

  • $ 就像大楼的正门入口
  • 后面的每一段就像走进不同的房间
  • $ 告诉你:"从这里开始找"

示例

{
  "company": "广州飞翔科技",
  "website": "www.feixiang.net"
}
JSONPath结果说明
$整个 JSON 对象根节点就是整个数据

💡 $ 单独使用时,返回的就是你传入的整个 JSON 数据。


当前节点标识符 @

什么是当前节点标识符?

@ 表示"当前正在处理的节点",它只能在过滤器选择器内部使用。

类比

想象你在一个部门里逐个检查员工:

  • @ 就像"当前正在看的那个人"
  • 你一个一个看,每看一个人,@ 就指向那个人

示例

{
  "members": [
    {"name": "航仔", "age": 28},
    {"name": "翼王", "age": 35},
    {"name": "图妹", "age": 30}
  ]
}

查询年龄大于 30 的员工:

$.members[?@.age > 30]

这里的 @ 依次代表:

  1. 第一个员工 {"name":"航仔","age":28}
  2. 第二个员工 {"name":"翼王","age":35}
  3. 第三个员工 {"name":"图妹","age":30}

过滤器会检查每个人的 age,最终返回翼王的数据。

⚠️ @ 不能在过滤器外面使用!$.@ 是非法的。


子段:深入下一层

什么是子段?

子段(Child Segment) 让查询从当前节点深入一层,访问它的子节点。

子段有两种写法:

写法说明示例
.name点表示法(简写)$.company
['name']括号表示法$['company']

示例 JSON

{
  "company": "广州飞翔科技",
  "website": "www.feixiang.net",
  "established": 2018,
  "departments": [
    {"name": "技术部", "members": [{"name": "航仔"}, {"name": "翼王"}]},
    {"name": "产品部", "members": [{"name": "图妹"}]}
  ]
}

一层一层深入

JSONPath结果路径说明
$整个 JSON根
$.company"广州飞翔科技"根 → company
$.departments数组(两个部门对象)根 → departments
$.departments[0]{"name":"技术部",...}根 → departments → 第1个
$.departments[0].name"技术部"根 → departments → 第1个 → name
$.departments[0].members[0].name"航仔"根 → departments → 第1个 → members → 第1个 → name

💡 每增加一个段,就深入一层。段越多,找到的数据位置越深。


点表示法的限制

点表示法 .name 虽然简洁,但有限制:

名称类型点表示法括号表示法
纯英文/中文✅ $.name✅ $['name']
含空格❌ 不支持✅ $['member name']
含特殊符号❌ 不支持✅ $['name@2024']
纯数字❌ 不支持✅ $['123']
含连字符❌ 不支持✅ $['first-name']

必须用括号表示法的例子

{
  "member name": "航仔",
  "first-name": "航",
  "2024": "今年"
}
$['member name']     → "航仔"
$['first-name']      → "航"
$['2024']            → "今年"

⚠️ $.member name 是非法的!因为点表示法不支持空格。


多个选择器组合在一个子段中

一个子段里可以写多个选择器,用逗号分隔:

{
  "company": "广州飞翔科技",
  "website": "www.feixiang.net",
  "established": 2018
}
$['company', 'website']

结果:

  • "广州飞翔科技"
  • "www.feixiang.net"

💡 这相当于同时查询多个字段,一次拿到多个值。


实战:飞翔科技公司信息查询

示例 JSON

{
  "company": "广州飞翔科技",
  "englishName": "FEIXIANG",
  "website": "www.feixiang.net",
  "established": 2018,
  "isActive": true,
  "slogan": "愿你朝华相顾,愿你前程似锦。",
  "departments": [
    {"name": "技术部", "headcount": 5},
    {"name": "产品部", "headcount": 3},
    {"name": "运营部", "headcount": 4}
  ]
}

查询练习

查询目标JSONPath结果
公司全称$.company"广州飞翔科技"
英文名称$.englishName"FEIXIANG"
官网$.website"www.feixiang.net"
成立年份$.established2018
是否活跃$.isActivetrue
标语$.slogan"愿你朝华相顾,愿你前程似锦。"
所有部门数据$.departments数组(3个部门对象)
第一个部门$.departments[0]{"name":"技术部","headcount":5}
第一个部门名$.departments[0].name"技术部"
第二个部门人数$.departments[1].headcount3
公司名和官网$['company', 'website']"广州飞翔科技"、"www.feixiang.net"

常见错误

错误写法问题正确写法
company缺少根标识符 $$.company
$.点后缺少名称$.company
$.departments.0数组索引用点表示法$.departments[0]
$.member name点表示法不支持空格$['member name']
$.@@ 不能在过滤器外使用$.name

一句话总结

提示

JSONPath 以 $ 开头表示根节点,. 或 [] 深入下一层。点表示法简洁但有限制,括号表示法更通用。@ 只在过滤器里用,表示"当前这个人"。

上一页
JSONPath 是什么
下一页
名称选择器