MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

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

2025-05-08 18:49 huorong 精选文章 11 ℃ 0 评论

对话实录

小白:(抓狂)这个 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

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言