JSONPath 是什么
本系列基于 RFC 9535 官方规范编写,面向零基础新手。 从本篇开始,进入 JSONPath 查询表达式的学习。
JSONPath 是什么?
JSONPath 是一种查询语言,用来从 JSON 数据中查找和提取你需要的内容。
生活类比
想象你有一份飞翔科技的员工档案(JSON 数据):
- 你想知道所有员工的姓名 → JSONPath 可以帮你找出来
- 你想知道技术部有哪些人 → JSONPath 可以筛选出来
- 你想知道年龄大于 30 岁的员工 → JSONPath 可以过滤出来
JSONPath 就像数据库的 SQL 查询语句,只不过它是专门用来查询 JSON 数据的。
JSONPath 与 JSON Pointer 的区别
RFC 9535 明确说明:JSONPath 不是 JSON Pointer 的替代品,而是更强大的伴侣。
| 特性 | JSON Pointer | JSONPath |
|---|---|---|
| 用途 | 定位单个已知路径的值 | 搜索和提取多个值 |
| 能力 | 只能按固定路径找 | 支持通配符、过滤、切片 |
| 类比 | 像直接按门牌号找人 | 像按条件搜索找人 |
示例对比
给定 JSON:
{
"company": "广州飞翔科技",
"departments": [
{"name": "技术部", "members": [{"name": "航仔"}, {"name": "翼王"}]},
{"name": "产品部", "members": [{"name": "图妹"}]}
]
}
| 工具 | 表达式 | 结果 |
|---|---|---|
| JSON Pointer | /departments/0/members/0/name | "航仔"(只能找一个) |
| JSONPath | $.departments[*].members[*].name | 航仔、翼王、图妹(找出一批) |
JSONPath 的设计灵感
JSONPath 的设计受到了 XPath(XML 的查询语言)的启发:
| XPath | JSONPath | 含义 |
|---|---|---|
/ | $ | 根节点 |
. | @ | 当前节点 |
// | .. | 后代(递归查找) |
* | * | 通配符 |
[] | [] | 下标/过滤 |
💡 如果你学过 XPath,JSONPath 会很容易上手。如果没学过,也完全没关系!
JSONPath 的基本结构
一个 JSONPath 表达式由以下部分组成:
$ + 段1 + 段2 + 段3 + ...
| 部分 | 说明 | 示例 |
|---|---|---|
$ | 根标识符,表示"从根开始" | $ |
.name | 子段(点表示法),选择对象的子节点 | $.company |
['name'] | 子段(括号表示法),功能同上 | $['company'] |
[0] | 索引选择器,选择数组元素 | $.departments[0] |
[*] | 通配符选择器,选择所有子节点 | $.departments[*] |
..name | 后代段,递归查找所有后代 | $..name |
[?expr] | 过滤器选择器,按条件筛选 | $.members[?@.age>30] |
第一个 JSONPath 例子
以下面的 JSON 为查询参数:
{
"company": "广州飞翔科技",
"website": "www.feixiang.net",
"established": 2018,
"departments": [
{"name": "技术部", "headcount": 5},
{"name": "产品部", "headcount": 3},
{"name": "运营部", "headcount": 4}
],
"slogan": "愿你朝华相顾,愿你前程似锦。"
}
查询示例
| JSONPath 表达式 | 结果 | 说明 |
|---|---|---|
$ | 整个 JSON | 根节点 |
$.company | "广州飞翔科技" | 查询公司名称 |
$.established | 2018 | 查询成立年份 |
$.departments[0] | {"name":"技术部","headcount":5} | 第一个部门 |
$.departments[0].name | "技术部" | 第一个部门的名称 |
$.departments[*].name | "技术部"、"产品部"、"运营部" | 所有部门名称 |
$..name | "技术部"、"产品部"、"运营部" | 递归找所有 name |
$.slogan | "愿你朝华相顾,愿你前程似锦。" | 公司标语 |
两种表示法:点表示法 vs 括号表示法
JSONPath 支持两种写法,功能完全相同:
点表示法(简写,更简洁)
$.company
$.departments[0].name
括号表示法(更通用,支持特殊字符)
$['company']
$['departments'][0]['name']
什么时候必须用括号表示法?
| 场景 | 点表示法 | 括号表示法 |
|---|---|---|
| 普通名称 | ✅ $.name | ✅ $['name'] |
| 名称含空格 | ❌ 不支持 | ✅ $['member name'] |
| 名称含特殊字符 | ❌ 不支持 | ✅ $['name@2024'] |
| 名称是数字 | ❌ 不支持 | ✅ $['123'] |
| 名称含中文 | ✅ $.名称 | ✅ $['名称'] |
💡 建议:平时用点表示法更简洁,遇到特殊名称时用括号表示法。
JSONPath 学习路线
接下来的文档,我们将逐个学习 JSONPath 的核心功能:
- ✅ JSONPath 是什么(本文)
- 根标识符和基本路径
- 名称选择器 —— 按键名找对象值
- 索引选择器 —— 按位置找数组元素
- 通配符选择器 ——
*匹配所有 - 数组切片选择器 ——
start:end:step - 过滤器选择器(上)—— 存在性测试与比较
- 过滤器选择器(下)—— 逻辑运算符
- 后代段 ——
..递归查找 - 函数扩展 ——
length()、count()等 - JSONPath 综合实战 —— 飞翔科技数据查询大全
提示
📌 记住一句话:JSONPath 就是 JSON 的"搜索语言",用 $ 开头,像导航一样一层层找到你想要的数据。