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

Python jsonpath库终极指南:json数据挖掘的精准导航仪

Python jsonpath库终极指南:json数据挖掘的精准导航仪

图片


对话实录

小白:(抓狂)这个 JSON 数据有好多层嵌套,怎么快速拿到最里面的值?

专家:(递上探测器)用jsonpath库,三步直达数据核心!


基础装备三件套

1. 安装神器

pip install jsonpath

2. 核心操作

import jsonpath# 示例数据
data = {"store1": {"book": [{"title": "Python入门", "price": 59},{"title": "数据挖掘", "price": 89, "stock": 0},{"title": "算法导论", "price": 129}],"location": "北京"},"store2": {"book": [{"title": "python进阶", "price": 51},{"title": "数据分析", "price": 45, "stock": 1},{"title": "人工智能", "price": 68}],"location": "天津"}
}
# 查找store1的所有书名
titles = jsonpath.jsonpath( data, "$.store1.book[*].title")print(titles)
# → ['Python入门', '数据挖掘', '算法导论']

专家提醒:1. 返回值是列表,找不到返回False! 2.传入的对象是字典,如果是json字符串需要事先转换为字典。

3.基础语法

jsonpath的语法比较简单和直观。它使用点号(.)和方括号([])来访问JSON对象的属性和数组元素,下面是一些常用的jsonpath语法:

原字符

描述

$

表示根节点,是jsonpath表达式的开始

@

当前节点

. or []

子节点

..

递归搜索(搜索符合条件的所有数据)

*

通配符,表示所有的内容

[]

支持访问数组,可以用于处理索引,元素等情况

[,]

支持迭代器中做多选,多个key用逗号隔开

[start:end:step]

数组分割操作,等同于切片

?()

应用过滤表示式,一般与@结合使用

六大实战寻宝案例

案例 1:深渊探测(深度查询)

# 递归查找所有价格
prices = jsonpath.jsonpath(data, "$..price")
# → [59, 89, 129, 51, 45, 68]# 递归查找store1的所有价格
prices = jsonpath.jsonpath(data, "$.store1..price")
# → [59, 89, 129]

$..price这种语法可以帮助我们轻松穿透多层JSON数据结构,找到所有的价格信息,就像拥有了一把能深入宝藏洞穴的探测仪。

案例 2:通配符匹配

# 查找所有的book数据
books = jsonpath.jsonpath(data, "$.*.book")
# → [[{'title': 'Python入门', 'price': 59}, {'title': '数据挖掘', 'price': 89, 'stock': 0},{'title': '算法导论', 'price': 129}], [{'title': 'python进阶', 'price': 51}, {'title': '数据分析', 'price': 45, 'stock': 1}, {'title': '人工智能', 'price': 68}]]#查找store1中book数组里面的数据
books = jsonpath.jsonpath(data, "$.store1.book[*]")
# → [{'title': 'Python入门', 'price': 59}, {'title': '数据挖掘', 'price': 89, 'stock': 0},{'title': '算法导论', 'price': 129}]

在这个例子中,*作为通配符条件,匹配当前节点的所有数据。

案例 3 :数组查询

#切片操作:查找store2中book索引为0的第一个数据
books = jsonpath.jsonpath(data, "$.store2.book[0]")
# → [{'title': 'python进阶', 'price': 51}]#切片操作:查找store2中book索引为0,2的数据
books = jsonpath.jsonpath(data, "$.store2.book[0,2]")
# → [{'title': 'python进阶', 'price': 51}, {'title': '人工智能', 'price': 68}]#多路径查询: 查找store2中book数据中title和price数据
books = jsonpath.jsonpath(data, "$.store2.book[*][title,price]")
# → ['python进阶', 51, '数据分析', 45, '人工智能', 68]

案例 4:动态路径

# 根据变量构建路径
index = 0
result = jsonpath.jsonpath(data, f"$.store1.book[{index}].title")

在实际开发中,数据的结构和需求可能会动态变化,动态路径查询为我们提供了灵活应对的能力,根据不同的情况获取所需数据。

案例 5:空值处理

# 安全访问不存在的路径
result = jsonpath.jsonpath(data, "$.store1.magazine[0].price") or ["缺货"]

当访问不存在的路径时,我们通过or操作符为结果设置默认值,避免因路径错误导致程序报错,保证了程序的稳定性。

案例 6:智能过滤

JSONPATH还支持使用过滤器来对JSON数据进行更精细的查询和过滤。过滤器中使用方括号[]中的表达式来指定过滤条件。下面是一些常见的过滤器:

==:等于 ; !=:不等于; <:小于; <=:小于或等于;

>:大于; >=:大于或等于; =~:正则表达式匹配; !~:不匹配正则表达式;

# 价格超过60且无库存的书籍
books = jsonpath.jsonpath(data, "$.store.book[?(@.price>60 && @.stock==0)]")
#-> [{'title': '数据挖掘', 'price': 89, 'stock': 0}]
# 查找有库存的书籍
books = jsonpath.jsonpath(data, "$.*.book[?(@.stock)]")
# → [{'title': '数据分析', 'price': 45, 'stock': 1}]

在这个例子中,?(@.stock)作为过滤条件,筛选出了有库存的书籍,让我们能够从众多数据中精准找到符合要求的部分。

专家级装备

1. 调试模式

# 查看解析过程
result = jsonpath.jsonpath(data, "$..price", debug=True)

调试模式可以帮助我们了解 jsonpath 的解析过程,定位查询过程中可能出现的问题,就像为数据挖掘之旅配备了一个故障诊断仪。

2. 结果格式化

# 获取带路径的结果
for match in jsonpath.jsonpath(data, "$..price", result_type="IPATH"):print(match)
#->
['store1', 'book', '0', 'price']
['store1', 'book', '1', 'price']
['store1', 'book', '2', 'price']
['store2', 'book', '0', 'price']
['store2', 'book', '1', 'price']
['store2', 'book', '2', 'price']for match in jsonpath.jsonpath(data, "$..price", result_type="PATH"):print(match)
#->
$['store1']['book'][0]['price']
$['store1']['book'][1]['price']
$['store1']['book'][2]['price']
$['store2']['book'][0]['price']
$['store2']['book'][1]['price']
$['store2']['book'][2]['price']

通过设置result_type="PATH"或者"IPATH",我们可以获取每个匹配结果的路径,方便对数据进行更细致的分析和处理。

小白:(跪了)原来数据挖掘可以这么优雅!

专家:(扶起小白)记住:jsonpath 是数据工程师的 GPS,但要看懂地图!

图片

http://www.xdnf.cn/news/1419.html

相关文章:

  • 消息中间件RabbitMQ02:账号的注册、点对点推送信息
  • MySQL运算符
  • kafka安装、spark安装
  • 5.学习笔记-SpringMVC(P53-P60)
  • Spring Boot 的配置加载顺序
  • Elasticsearch学习
  • 【Hive入门】Hive基础操作与SQL语法:DDL操作全面指南
  • 国内ip地址怎么改?详细教程
  • AI搜索AI SEO排名:国际采购商的搜索行为正在被AI重塑
  • 高防IP是什么
  • 批量处理多个 Word 文档:插入和修改页眉页脚,添加页码的方法
  • 什么是量子计算?它能做什么?
  • JAVA同步器CyclicBarrier
  • 【Project】基于spark-App端口懂车帝数据采集与可视化
  • 【网络原理】TCP提升效率机制(一):滑动窗口
  • VBA批量读取access数据库(.mdb)
  • JAVA猜数小游戏
  • 面试篇:Java集合
  • 新手村:过拟合(Overfitting)
  • WPF 图片文本按钮 自定义按钮
  • Shopee五道质检系统重构东南亚跨境格局,2025年电商游戏规则悄然改写
  • DIY钢铁侠方舟反应堆第二期—第一代电路板展示
  • 【开源】STM32HAL库驱动ST7789_240×240(硬件SPI+软件SPI)
  • Yocto项目实战教程-第8章树莓派启动定制镜像-8.3小节-树莓派BSP层
  • Redis的string类型使用
  • 大数据利器Kafka
  • 基于PaddleOCR对图片中的excel进行识别并转换成word优化(二)
  • 【白雪讲堂】GEO优化第7篇 -构建《推荐类》内容的结构化模板
  • EasySearch 服务昨天还好好的,为什么今天突然访问不了了?
  • 安卓14默认赋予应用权限