根标识符和基本路径
根标识符 $
什么是根标识符?
$ 是 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]
这里的 @ 依次代表:
- 第一个员工
{"name":"航仔","age":28} - 第二个员工
{"name":"翼王","age":35} - 第三个员工
{"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" |
| 成立年份 | $.established | 2018 |
| 是否活跃 | $.isActive | true |
| 标语 | $.slogan | "愿你朝华相顾,愿你前程似锦。" |
| 所有部门数据 | $.departments | 数组(3个部门对象) |
| 第一个部门 | $.departments[0] | {"name":"技术部","headcount":5} |
| 第一个部门名 | $.departments[0].name | "技术部" |
| 第二个部门人数 | $.departments[1].headcount | 3 |
| 公司名和官网 | $['company', 'website'] | "广州飞翔科技"、"www.feixiang.net" |
常见错误
| 错误写法 | 问题 | 正确写法 |
|---|---|---|
company | 缺少根标识符 $ | $.company |
$. | 点后缺少名称 | $.company |
$.departments.0 | 数组索引用点表示法 | $.departments[0] |
$.member name | 点表示法不支持空格 | $['member name'] |
$.@ | @ 不能在过滤器外使用 | $.name |
一句话总结
提示
JSONPath 以 $ 开头表示根节点,. 或 [] 深入下一层。点表示法简洁但有限制,括号表示法更通用。@ 只在过滤器里用,表示"当前这个人"。