python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python JSONPath

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

作者:hui函数

JSONPath 是一种用于在 JSON 文档中定位和提取数据的查询语言,类似于 XPath 在 XML 中的作用,下面小编就来和大家详细讲讲JSONPath高效查询技巧

一、JSONPath 简介

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

核心功能

二、基础语法详解

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

您可能感兴趣的文章:
阅读全文