JsonPath学习

jsonpath 是 Python 中专门用于从复杂 JSON / 字典数据中快速提取数据的库,类似 XPath 提取 XML 数据,不用一层层嵌套遍历,语法简洁高效。

pip install jsonpath

二、核心语法(必记)

语法作用
$ 根节点(最外层数据)
. 取子节点
.. 递归搜索所有后代节点(不管层级)
* 匹配所有子节点
[] 数组下标 / 过滤
[@] 过滤时表示当前节点

三、基础使用步骤

  1. 导入 jsonpath 模块
  2. 准备 JSON 数据(Python 字典 / 列表格式)
  3. 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]')

六、注意事项

  1. 返回值:永远返回列表,没找到数据返回 False
  2. 数据格式:传入的必须是 Python 字典 / 列表(JSON 解析后的数据),不是 JSON 字符串
  3. 大小写敏感:节点名称必须严格区分大小写

总结

  1. 安装:pip install jsonpath
  2. 核心函数:jsonpath(数据, 路径表达式)
  3. 万能语法:$..key 快速提取所有同名节点
  4. 过滤语法:$..[?(@.key>值)] 按条件筛选
  5. 适合处理嵌套复杂的 JSON 数据,替代繁琐的多层遍历

posted on 2026-04-07 12:51  //君莫笑  阅读(1)  评论(0)    收藏  举报

导航