一、jsonpath 简介
jsonpath 是一种用于在 json 文档中定位和提取数据的查询语言,类似于 xpath 在 xml 中的作用
核心功能
- 导航 json 数据结构
- 提取特定节点或值
- 过滤符合条件的元素
- 支持复杂条件查询
二、基础语法详解
1. 根元素与子节点
语法 | 说明 | 示例 | 结果解释 |
---|---|---|---|
$ | 根对象 | $ | 整个 json 文档 |
. | 子节点访问 | $.store | store 对象 |
[] | 子节点访问(替代) | $['store'] | store 对象 |
2. 通配符与多选
语法 | 说明 | 示例 | 结果解释 |
---|---|---|---|
* | 匹配所有元素 | $.* | 根下的所有直接子节点 |
.* | 对象的所有属性 | $.store.* | store 的所有直接子节点 |
[a,b] | 选择多个指定键 | $['a','b'] | 返回 a 和 b 的值 |
三、数组操作深度解析
1. 索引与切片
// 示例数据 [10, 20, 30, 40, 50]
表达式 | 结果 | 说明 |
---|---|---|
$[0] | 10 | 第一个元素(索引从0开始) |
$[-1] | 50 | 最后一个元素 |
$[1:3] | [20, 30] | 切片(左闭右开) |
$[2:] | [30,40,50] | 从索引2到结束 |
$[:3] | [10,20,30] | 从开始到索引3(不包括索引3) |
$[0,2,4] | [10,30,50] | 选择多个指定索引 |
2. 递归下降操作符
// 示例数据 { "a": {"x": 1}, "b": [{"x": 2}, {"y": 3}], "x": 4 }
表达式 | 结果 | 说明 |
---|---|---|
$..x | [1, 2, 4] | 所有层级的 x 属性 |
$..* | 所有值 | 递归返回所有节点值 |
$..[0] | [{"x":2}] | 所有数组的第一个元素 |
四、高级查询技术
1. 过滤表达式
// 示例数据:商品列表 [ {"id": 1, "name": "laptop", "price": 1200, "stock": 5}, {"id": 2, "name": "mouse", "price": 25, "stock": 0}, {"id": 3, "name": "keyboard", "price": 80, "stock": 10} ]
表达式 | 结果 | 说明 |
---|---|---|
$[?(@.price < 100)] | [mouse, keyboard] | 价格低于100的商品 |
$[?(@.stock > 0)] | [laptop, keyboard] | 有库存的商品 |
$[?(@.name == 'laptop')] | [laptop] | 名称为laptop的商品 |
$[?(@.name =~ /^m.*/i)] | [mouse] | 名称以m开头的商品 |
2. 复杂条件组合
表达式 | 结果 | 说明 |
---|---|---|
$[?(@.price >= 50 && @.price <= 100)] | [keyboard] | 价格在50-100之间的商品 |
$[?(@.stock == 0 || @.price > 1000)] | [laptop, mouse] | 无库存或价格高于1000的商品 |
$[?(!@.stock)] | [mouse] | 没有stock属性的商品 |
五、函数扩展(实现相关)
1. 常用函数
函数 | 说明 | 示例 | 结果 |
---|---|---|---|
length() | 数组/字符串长度 | $[?(@.tags.length()>1)] | 标签>1的项 |
min() | 最小值 | $.prices.min() | 最低价格 |
max() | 最大值 | $.prices.max() | 最高价格 |
avg() | 平均值 | $.prices.avg() | 平均价格 |
2. 类型检查
表达式 | 说明 |
---|---|
$[?(@.price typeof 'number')] | 价格是数字类型的项 |
$[?(@.name typeof 'string')] | 名称是字符串类型的项 |
六、综合实战示例
示例数据
{ "company": "techcorp", "departments": [ { "name": "dev", "employees": [ {"id": 101, "name": "alice", "salary": 8000, "skills": ["java", "python"]}, {"id": 102, "name": "bob", "salary": 7500, "skills": ["javascript"]} ] }, { "name": "qa", "employees": [ {"id": 201, "name": "charlie", "salary": 7000, "skills": ["testing", "automation"]}, {"id": 202, "name": "diana", "salary": 8500} ] } ] }
查询示例
1.获取所有员工对象:
$..employees[*]
2.查找工资超过7800的员工:
$..employees[?(@.salary > 7800)] // 结果:[{"id":101,...}, {"id":202,...}]
3.获取dev部门员工的姓名:
$.departments[?(@.name == 'dev')].employees[*].name // 结果:["alice", "bob"]
4.查找掌握java技能的员工:
注意:python 的 jsonpath
库对 contains
的支持可能有限
方法1:使用 jsonpath-ng
库(功能更强大)
# 先安装:pip install jsonpath-ng from jsonpath_ng import parse # 更可靠的查询 expr = parse("$..employees[?(@.skills contains 'java')]") matches = [match.value for match in expr.find(json_dict)]
方法2:使用in关键字
res = jsonpath.jsonpath(json_dict,"$..employees[?('java' in @.skills)]")
方法3:使用正则表达式匹配
# 使用正则表达式匹配 res = jsonpath.jsonpath(json_dict, "$..employees[?(@.skills =~ /.*java.*/i)]")
5.统计qa部门员工数:
方法1:使用 jsonpath-ng
库(功能更强大,支持length()方法)
$.departments[?(@.name == 'qa')].employees.length() // 结果:2
方法2:使用jsonpath
库(不支持length()方法),使用python的len()
函数
res = jsonpath.jsonpath(json_dict,"$.departments[?(@.name == 'qa')].employees.*") print(len(res))
6.获取所有技能列表(去重):
$..skills[*] // 结果:["java", "python", "javascript", "testing", "automation"]
七、注意事项与最佳实践
1.大小写敏感:
$.store // 错误(应为小写s) $.store // 正确
2.特殊字符处理:
$['special-key'] // 包含连字符的键 $['@attribute'] // 以@开头的键
3.性能优化:
- 避免过度使用递归
..
- 尽量使用具体路径而非通配符
- 先过滤后处理
4.实现差异:
- 不同语言的库支持程度不同
- 函数扩展非标准实现
- 空值处理方式可能不同
到此这篇关于python jsonpath进阶实战之高效查询技巧全解析的文章就介绍到这了,更多相关python jsonpath内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论