Python JSONPath进阶实战之高效查询技巧全解析

 更新时间:2025年08月04日 10:01:23   作者:hui函数  
JSONPath 是一种用于在 JSON 文档中定位和提取数据的查询语言,类似于 XPath 在 XML 中的作用,下面小编就来和大家详细讲讲JSONPath高效查询技巧

一、JSONPath 简介

JSONPath 是一种用于在 JSON 文档中定位和提取数据的查询语言,类似于 XPath 在 XML 中的作用

核心功能

  • 导航 JSON 数据结构
  • 提取特定节点或值
  • 过滤符合条件的元素
  • 支持复杂条件查询

二、基础语法详解

1. 根元素与子节点

语法说明示例结果解释
$根对象$整个 JSON 文档
.子节点访问$.storestore 对象
[]子节点访问(替代)$['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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 总结网络IO模型与select模型的Python实例讲解

    总结网络IO模型与select模型的Python实例讲解

    同步、异步、阻塞、非阻塞,当这些网络IO名词堆到一起时难免使编程初学者感到困惑,这里我们就来为大家总结网络IO模型与select模型的Python实例讲解:
    2016-06-06
  • Python爬虫+tkinter界面实现历史天气查询的思路详解

    Python爬虫+tkinter界面实现历史天气查询的思路详解

    这篇文章主要介绍了Python爬虫+tkinter界面实现历史天气查询的思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Python实现分段线性插值

    Python实现分段线性插值

    这篇文章主要为大家详细介绍了Python实现分段线性插值,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • YOLOv5构建安全帽检测和识别系统使用详解

    YOLOv5构建安全帽检测和识别系统使用详解

    这篇文章主要为大家介绍了YOLOv5构建安全帽检测和识别系统使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • python绘制动态曲线教程

    python绘制动态曲线教程

    今天小编就为大家分享一篇python绘制动态曲线教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 关于pycharm python3.7成功安装dlib库的问题

    关于pycharm python3.7成功安装dlib库的问题

    这篇文章主要介绍了pycharm python3.7成功安装dlib库的解决方法,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Python实现FM算法解析

    Python实现FM算法解析

    这篇文章主要介绍了Python实现FM算法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Python使用pyautocad+openpyxl处理cad文件示例

    Python使用pyautocad+openpyxl处理cad文件示例

    这篇文章主要介绍了Python使用pyautocad+openpyxl处理cad文件,结合实例形式分析了Python使用pyautocad与openpyxl模块读写cad文件相关应用操作技巧,需要的朋友可以参考下
    2019-07-07
  • Python Reduce函数的高级用法详解

    Python Reduce函数的高级用法详解

    这篇文章主要介绍了reduce函数的工作原理和应用,同时提供丰富的示例代码,方便更好地理解如何使用reduce函数来轻松解决复杂的数据聚合问题,需要的可以参考下
    2023-11-11
  • Python调用C语言的方法【基于ctypes模块】

    Python调用C语言的方法【基于ctypes模块】

    这篇文章主要介绍了Python调用C语言的方法,涉及Python基于ctypes模块调用C语言编译后的动态链接库文件相关操作技巧,需要的朋友可以参考下
    2018-01-01

最新评论