网站首页 > 精选文章 / 正文
对话实录
小白:(抓狂)这个 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,但要看懂地图!
Tags:jsonpath解析json
猜你喜欢
- 2025-05-08 开源JSON可视神器,让阅读JSON变得简单!-JSONHero
- 2025-05-08 JMeter 断言详解(jmeter做断言)
- 2025-05-08 Python JSON数据处理全攻略:从入门到实战,新手也能轻松掌握!
- 2025-05-08 越晚搞懂 MySQL JSON 数据类型,你就越吃亏
- 2025-05-08 通过 JSON Schema 完成接口自动化测试的数据验证
- 2025-05-08 SpringBoot读取资源目录中的JSON文件方法
- 2025-05-08 真强!使用JSON文件作为Spring Boot配置属性
- 2025-05-08 接口自动化测试之JSON Schema模式该如何使用?
- 2025-05-08 23-Python-第三方库Json(python第三方库有什么)
- 2025-05-08 KingbaseES JSON全解析:记录操作与高级表格处理