JsonPath学习
jsonpath 是 Python 中专门用于从复杂 JSON / 字典数据中快速提取数据的库,类似 XPath 提取 XML 数据,不用一层层嵌套遍历,语法简洁高效。
pip install jsonpath
二、核心语法(必记)
| 语法 | 作用 |
|---|---|
$ |
根节点(最外层数据) |
. |
取子节点 |
.. |
递归搜索所有后代节点(不管层级) |
* |
匹配所有子节点 |
[] |
数组下标 / 过滤 |
[@] |
过滤时表示当前节点 |
三、基础使用步骤
- 导入
jsonpath模块 - 准备 JSON 数据(Python 字典 / 列表格式)
- 用
jsonpath.jsonpath()执行提取
四、完整示例代码
# 1. 导入库 from jsonpath import jsonpath # 2. 模拟复杂 JSON 数据(Python 字典) data = { "school": "第一中学", "classes": [ { "class_name": "高一1班", "students": [ {"name": "张三", "age": 16, "score": 90}, {"name": "李四", "age": 17, "score": 85} ] }, { "class_name": "高一2班", "students": [ {"name": "王五", "age": 16, "score": 95}, {"name": "赵六", "age": 17, "score": 88} ] } ] } # 3. 常用提取示例 # 提取根节点的学校名称 print("学校名称:", jsonpath(data, '$.school')) # 提取所有班级名称 print("所有班级:", jsonpath(data, '$.classes[*].class_name')) # 提取所有学生的姓名(递归搜索,无视层级) print("所有学生姓名:", jsonpath(data, '$..name')) # 提取所有学生的分数 print("所有分数:", jsonpath(data, '$..score')) # 提取分数大于90的学生姓名 print("90分以上学生:", jsonpath(data, '$..[?(@.score>90)].name')) # 提取第一个班级的第一个学生姓名 print("第一个班级第一名:", jsonpath(data, '$.classes[0].students[0].name'))
输出结果:
学校名称: ['第一中学']
所有班级: ['高一1班', '高一2班']
所有学生姓名: ['张三', '李四', '王五', '赵六']
所有分数:
[90, 85, 95, 88]
90分以上学生: ['王五']
第一个班级第一名: ['张三']
五、常用语法详解
1. 基础提取
$.key:提取根节点下的直接子节点
jsonpath(data, '$.school') # ['第一中学']
$.key[*].key:提取数组中所有元素的子节点
jsonpath(data, '$.classes[*].class_name') # 所有班级名
2. 递归提取(最实用)
$..key:不管数据层级多深,直接提取所有同名节点
jsonpath(data, '$..name') # 所有学生姓名
3. 条件过滤
$..[?(@.key 运算符 值)]:按条件筛选数据# 年龄等于16的学生 jsonpath(data, '$..[?(@.age==16)].name') # 分数大于等于90的学生 jsonpath(data, '$..[?(@.score>=90)].name')
4. 数组索引
# 第一个班级 jsonpath(data, '$.classes[0]') # 最后一个班级 jsonpath(data, '$.classes[-1]')
六、注意事项
- 返回值:永远返回列表,没找到数据返回
False - 数据格式:传入的必须是 Python 字典 / 列表(JSON 解析后的数据),不是 JSON 字符串
- 大小写敏感:节点名称必须严格区分大小写
总结
- 安装:
pip install jsonpath - 核心函数:
jsonpath(数据, 路径表达式) - 万能语法:
$..key快速提取所有同名节点 - 过滤语法:
$..[?(@.key>值)]按条件筛选 - 适合处理嵌套复杂的 JSON 数据,替代繁琐的多层遍历
浙公网安备 33010602011771号