JSONPath 综合实战
实战数据
以下 JSON 将作为所有查询的查询参数:
{
"company": "广州飞翔科技",
"englishName": "FEIXIANG",
"website": "www.feixiang.net",
"established": 2018,
"isActive": true,
"slogan": "愿你朝华相顾,愿你前程似锦。",
"departments": [
{
"name": "技术部",
"headcount": 5,
"members": [
{"name": "航仔", "position": "后端开发", "age": 28, "isActive": true, "salary": 8888.00, "hobbies": ["钓鱼", "看科幻小说", "深夜撸串"]},
{"name": "翼王", "position": "架构师", "age": 35, "isActive": true, "salary": 232000.00, "hobbies": ["健身", "改装车", "收藏机械键盘"]},
{"name": "凌叔", "position": "运维工程师", "age": 32, "isActive": true, "salary": 12000.00, "hobbies": ["泡茶", "养鹦鹉", "逛花鸟市场"]},
{"name": "空少", "position": "前端开发", "age": 26, "isActive": true, "salary": 15000.00, "hobbies": ["穿搭", "探店", "拍vlog"]},
{"name": "风速", "position": "算法工程师", "age": 29, "isActive": false, "salary": 18000.00, "hobbies": ["竞速游戏", "魔方", "收集跑鞋"]}
]
},
{
"name": "产品部",
"headcount": 3,
"members": [
{"name": "图妹", "position": "产品经理", "age": 30, "isActive": true, "salary": 20000.00, "hobbies": ["手账", "盲盒", "奶茶测评"]},
{"name": "星宇", "position": "产品助理", "age": 24, "isActive": true, "salary": 8000.00, "hobbies": ["天文", "indie游戏", "写科幻短篇"]},
{"name": "靓晴", "position": "UI设计师", "age": 27, "isActive": true, "salary": 16000.00, "hobbies": ["插画", "烘焙", "逛展"]}
]
},
{
"name": "运营部",
"headcount": 4,
"members": [
{"name": "鸣哥", "position": "内容运营", "age": 31, "isActive": true, "salary": 14000.00, "hobbies": ["脱口秀", "剧本杀", "组织饭局"]},
{"name": "雁姐", "position": "用户运营", "age": 33, "isActive": true, "salary": 17000.00, "hobbies": ["炒股", "煲汤", "家长里短情报站"]},
{"name": "波比", "position": "活动运营", "age": 25, "isActive": true, "salary": 10000.00, "hobbies": ["街舞", "极限运动", "薅羊毛"]},
{"name": "云吞", "position": "社群运营", "age": 24, "isActive": true, "salary": 9000.00, "hobbies": ["探店", "做甜品", "追港剧"]}
]
}
]
}
基础查询
2.1 公司基本信息
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 公司全称 | $.company | "广州飞翔科技" |
| 英文名称 | $.englishName | "FEIXIANG" |
| 官网 | $.website | "www.feixiang.net" |
| 成立年份 | $.established | 2018 |
| 是否活跃 | $.isActive | true |
| 标语 | $.slogan | "愿你朝华相顾,愿你前程似锦。" |
2.2 部门信息
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 所有部门 | $.departments | 3 个部门对象 |
| 部门数量 | $.departments[*] | 3 个部门对象 |
| 第一个部门 | $.departments[0] | 技术部对象 |
| 最后一个部门 | $.departments[-1] | 运营部对象 |
| 所有部门名称 | $.departments[*].name | 技术部、产品部、运营部 |
| 所有部门人数 | $.departments[*].headcount | 5、3、4 |
员工信息查询
3.1 按部门查员工
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 技术部所有员工 | $.departments[0].members[*] | 5 个员工对象 |
| 技术部所有员工姓名 | $.departments[0].members[*].name | 航仔、翼王、凌叔、空少、风速 |
| 产品部所有员工职位 | $.departments[1].members[*].position | 产品经理、产品助理、UI设计师 |
| 运营部第 1 人 | $.departments[2].members[0] | 鸣哥对象 |
| 运营部最后 1 人 | $.departments[2].members[-1] | 云吞对象 |
3.2 跨部门查询(用通配符)
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 全公司所有员工 | $.departments[*].members[*] | 12 个员工对象 |
| 全公司所有员工姓名 | $.departments[*].members[*].name | 12 个姓名 |
| 全公司所有员工职位 | $.departments[*].members[*].position | 12 个职位 |
| 全公司所有员工年龄 | $.departments[*].members[*].age | 12 个年龄 |
3.3 递归查询(用后代段)
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 递归找所有 name | $..name | 技术部、产品部、运营部、航仔、翼王...(共 15 个) |
| 递归找所有 position | $..position | 12 个职位 |
| 递归找所有 age | $..age | 12 个年龄 |
| 递归找所有 hobbies 数组 | $..hobbies | 12 个爱好数组 |
| 递归找所有爱好 | $..hobbies[*] | 所有爱好字符串 |
条件筛选查询
4.1 按年龄筛选
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 年龄大于 30 | $.departments[*].members[?@.age > 30] | 翼王、凌叔、鸣哥、雁姐 |
| 年龄小于 25 | $.departments[*].members[?@.age < 25] | 星宇、云吞 |
| 年龄在 25~30 之间 | $.departments[*].members[?@.age >= 25 && @.age <= 30] | 航仔、空少、风速、图妹、靓晴、波比 |
4.2 按部门+条件筛选
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 技术部年龄>30 | $.departments[0].members[?@.age > 30] | 翼王、凌叔 |
| 产品部年龄<30 | $.departments[1].members[?@.age < 30] | 星宇、靓晴 |
| 运营部年龄>30 | $.departments[2].members[?@.age > 30] | 鸣哥、雁姐 |
4.3 按工资筛选
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 工资大于 15000 | $.departments[*].members[?@.salary > 15000] | 翼王、图妹、靓晴、雁姐 |
| 工资小于 10000 | $.departments[*].members[?@.salary < 10000] | 航仔、星宇、云吞 |
| 工资在 10000~20000 之间 | $.departments[*].members[?@.salary >= 10000 && @.salary <= 20000] | 凌叔、空少、风速、图妹、靓晴、鸣哥、波比、雁姐 |
4.4 按在职状态筛选
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 已离职员工 | $.departments[*].members[?@.isActive == false] | 风速 |
| 在职员工 | $.departments[*].members[?@.isActive] | 其余 11 人 |
复杂组合查询
5.1 多条件组合
| 查询目标 | JSONPath | 结果 | ||
|---|---|---|---|---|
| 技术部且在职且年龄>30 | $.departments[0].members[?@.isActive && @.age > 30] | 翼王、凌叔 | ||
| 工资>15000且年龄<30 | $.departments[*].members[?@.salary > 15000 && @.age < 30] | 靓晴 | ||
| 技术部或产品部且工资>15000 | `$.departments[*].members[?(@.position == '架构师' \ | \ | @.position == '产品经理') && @.salary > 15000]` | 翼王、图妹 |
5.2 函数查询
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 爱好>=3个的员工 | $.departments[*].members[?length(@.hobbies) >= 3] | 全部 12 人(每人都有 3 个爱好) |
| 成员>=4人的部门 | $.departments[?count(@.members) >= 4] | 技术部、运营部 |
| 成员=3人的部门 | $.departments[?count(@.members) == 3] | 产品部 |
切片查询
| 查询目标 | JSONPath | 结果 |
|---|---|---|
| 前 2 个部门 | $.departments[:2] | 技术部、产品部 |
| 除第 1 个部门外的员工 | $.departments[1:].members[*].name | 图妹、星宇、靓晴、鸣哥、雁姐、波比、云吞 |
| 技术部前 3 人 | $.departments[0].members[:3] | 航仔、翼王、凌叔 |
| 技术部后 2 人 | $.departments[0].members[-2:] | 空少、风速 |
| 技术部倒序 | $.departments[0].members[::-1] | 风速、空少、凌叔、翼王、航仔 |
JSONPath 语法速查表
| 语法 | 含义 | 示例 | ||||
|---|---|---|---|---|---|---|
$ | 根节点 | $ | ||||
@ | 当前节点(过滤器内) | ?@.age > 30 | ||||
.name | 子段(点表示法) | $.company | ||||
['name'] | 子段(括号表示法) | $['company'] | ||||
[*] | 通配符 | $.members[*] | ||||
.* | 通配符简写 | $.obj.* | ||||
[0] | 索引 | $.members[0] | ||||
[-1] | 负数索引 | $.members[-1] | ||||
[1:3] | 切片 | $.members[1:3] | ||||
[::-1] | 反向切片 | $.members[::-1] | ||||
..name | 后代段 | $..name | ||||
..* | 所有后代 | $..* | ||||
[?expr] | 过滤器 | $.members[?@.age > 30] | ||||
&& | 逻辑 AND | ?@.age > 25 && @.age < 30 | ||||
| `\ | \ | ` | 逻辑 OR | `?@.dept == '技术部' \ | \ | @.dept == '产品部'` |
! | 逻辑 NOT | ?!@.isActive | ||||
== | 等于 | ?@.age == 28 | ||||
!= | 不等于 | ?@.dept != '技术部' | ||||
> < >= <= | 比较 | ?@.salary > 10000 | ||||
length() | 长度函数 | ?length(@.hobbies) >= 3 | ||||
count() | 计数函数 | ?count(@.members) >= 4 | ||||
match() | 正则匹配 | ?match(@.phone, '138.*') | ||||
search() | 正则搜索 | ?search(@.hobbies, '游戏') |
学习路线回顾
恭喜你读完了全部 21 篇 JSON + JSONPath 学习指南!
JSON 基础(10 篇):
- JSON 是什么
- 六种数据类型
- 对象 Object
- 数组 Array
- 字符串 String
- 数字 Number
- 布尔值和 Null
- 字符编码与转义
- JSON 语法规则
- 综合应用示例
JSONPath 查询(11 篇): 11. JSONPath 是什么 12. 根标识符和基本路径 13. 名称选择器 14. 索引选择器 15. 通配符选择器 16. 数组切片选择器 17. 过滤器选择器(上) 18. 过滤器选择器(下) 19. 后代段 20. 函数扩展 21. 综合实战
提示
📌 JSONPath 核心口诀:
$ 开头找根,@ 当前元素; . 深入一层,.. 递归全找; [] 选索引,[*] 全都要; [?] 加条件,&& || ! 组合妙; length count match search 函数来帮忙。