当前位置: 首页 > ops >正文

python使用jsonpath-ng库操作json数据

jsonpath-ng 库的详细使用如下:

一、安装与导入

  1. 安装
    通过 pip 安装库:

    pip install jsonpath-ng
    

    支持 Python 3.6 及以上版本。

  2. 导入核心模块
    主要使用 parse 函数和 JSONPath 对象:

    from jsonpath_ng import parse
    

二、基础查询操作
1. 简单路径查询
• 场景:从 JSON 中提取指定路径的值。

data = {"person": {"name": "Alice","age": 30,"address": {"city": "New York"}}
}
# 解析表达式
expression = parse("person.name")
# 查找匹配结果
matches = expression.find(data)
print(matches[0].value)  # 输出:Alice

支持点号 . 或中括号 [] 访问路径,如 parse("person['address']['city']"),
expression.find() 函数 返回的是一个DatumInContext对象

2. 数组遍历查询
• 场景:提取列表中的所有元素。

使用 [*] 通配符匹配数组元素:

data = {"products": [{"name": "A", "price": 10}, {"name": "B", "price": 20}]}
expression = parse("products[*].price")
matches = [match.value for match in expression.find(data)]
print(matches)  # 输出:[10, 20]

适用于嵌套数组的递归查询(如 $..price)。


三、高级查询语法
1. 过滤条件
• 场景:筛选符合条件的数据。

使用 [?()] 表达式实现动态过滤:

data = {"store": {"books": [{"title": "Book1", "price": 15},{"title": "Book2", "price": 25}]}
}
# 筛选价格低于20的书籍
expression = parse("store.books[?(@.price < 20)].title")
matches = [match.value for match in expression.find(data)]
print(matches)  # 输出:["Book1"]

支持逻辑运算符(&&||)和算术运算。

[?(@.price < 20)]:过滤条件

  • (1) []:数组索引或过滤器操作符
    作用:表示对数组的操作,内部可以包含索引(如 [0])或过滤条件(如 [?()])。

    示例:

    books[0]:选择第一本书。books[?()]:根据条件筛选书籍。
    
  • (2) ?():条件过滤语法
    作用:定义过滤逻辑,?() 内需编写布尔表达式。
    示例:

    books[?(@.price < 20)]  // 筛选价格低于20的书籍
    
  • (3) @:当前节点引用
    作用:在过滤器中表示当前遍历到的数组元素(即每本书的对象)。
    示例:

    {"title": "Book A", "price": 15}  // 当前@指向此对象
    

    @.price 表示当前书籍的 price 属性值。

  • (4) @.price < 20:过滤逻辑
    作用:比较当前书籍的价格是否小于 20。
    扩展语法:

    • 逻辑运算符:&&(与)、||(或)、!(非),如 @.price < 20 && @.category == "fiction"

    • 正则匹配:=~(如 @.title =~ /^The/)。

2. 函数操作
• 场景:对数据进行聚合计算。

使用内置函数如 length()sum()

expression = parse("sum(store.books[*].price)")
total_price = expression.find(data)[0].value
print(total_price)  # 输出:40

其他函数包括 min()max() 等。


四、数据修改操作
1. 键值修改
• 场景:动态更新 JSON 数据中的值。

通过 update() 方法修改匹配项:

expression = parse("person.name")
matches = expression.find(data)
if matches:matches[0].update("Bob")  # 将 Alice 改为 Bob
print(data["person"]["name"])  # 输出:Bob

适用于批量修改场景。


五、实际应用案例
1. 接口测试验证
• 场景:验证接口返回数据的关键字段。

import requests
response = requests.get("https://api.example.com/user/1")
data = response.json()
# 验证用户ID是否为1
expression = parse("user.id")
user_id = expression.find(data)[0].value
assert user_id == 1, "用户ID验证失败"

2. 数据提取与转换
• 场景:从复杂 JSON 中提取结构化数据。

data = {"orders": [{"id": 1, "items": [{"name": "item1", "qty": 2}]},{"id": 2, "items": [{"name": "item2", "qty": 3}]}]
}
# 提取所有订单的商品名称和数量
expression = parse("orders[*].items[*].[name, qty]")
matches = [match.value for match in expression.find(data)]
print(matches)  # 输出:[["item1", 2], ["item2", 3]]

六、注意事项

  1. 路径大小写敏感:JSON 键名需严格匹配大小写。
  2. 错误处理:捕获 IndexErrorKeyError 避免程序崩溃:
    try:matches = expression.find(data)if not matches:print("未找到匹配项")
    except Exception as e:print(f"查询失败:{e}")
    
  3. 性能优化:对大型 JSON 数据避免频繁解析表达式,可预编译重用 parse 对象。
http://www.xdnf.cn/news/7335.html

相关文章:

  • 创建型:抽象工厂模式
  • 【RAG系统高效召回2】[特殊字符] 提升 RAG 系统检索质量的六大策略:从 top-k 到索引扩展
  • SpringBoot-1-入门概念介绍和第一个Spring Boot项目
  • 如何在LVGL之外的线程更新UI内容
  • 《Linux服务与安全管理》| DNS服务器安装和配置
  • 进程退出 和 僵尸进程、孤儿进程
  • 电子电路原理第十六章(负反馈)
  • 打卡第二十二天
  • 鸿蒙PC操作系统:从Linux到自研微内核的蜕变
  • Vue 3 项目开发 MinIO 文件管理模块
  • 数字图像处理——图像压缩
  • ai agent(智能体)开发 python高级应用8:crawl4ai 对用 LLMExtractionStrategy 和 python的 re 如何选择
  • 【C++】19. set和map的使用
  • Vue.js---立即执行的watch与回调执行时机
  • 【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
  • 支持python的单片机有哪些
  • 高防CDN:让攻击流量“一键清零“的智能防御之道
  • 动态页面采集技术
  • Spring Boot入门案例(Spring Initializr方式,IDEA版)
  • 新时代的可观测性:拥抱 GuanceDB 3.0
  • 前端的面试笔记——HTMLJavaScript篇(二)前端页面性能检测
  • 2025B卷 - 华为OD机试七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
  • 192环境记录 zlm2
  • 大小端模式和消息的加密解密
  • IPV4详解和ensp基础命令
  • C#学习9——接口、抽象类
  • Web3:Ubuntu系统 使用Docker-compose方式部署blockscout浏览器配置版本-v5.2.3-beta+charts图表
  • 2025ICPC邀请赛南昌游记
  • 架构演变 -单体到云原生
  • C++学习:六个月从基础到就业——C++20:范围(Ranges)进阶