当前位置: 代码网 > it编程>前端脚本>Python > Python JSONPath进阶实战之高效查询技巧全解析

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

2025年08月04日 Python 我要评论
一、jsonpath 简介jsonpath 是一种用于在 json 文档中定位和提取数据的查询语言,类似于 xpath 在 xml 中的作用核心功能导航 json 数据结构提取特定节点或值过滤符合条件

一、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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com