网站首页 > 博客文章 正文
学习目录
jsonpath安装
jsonpath使用
jsonpath语法
使用介绍
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,目前被广泛应用,在实际使用过程中不管是开发工程师还是测试工程师都必须学会json数据的处理。
Python中有几个库可以比较好的处理json数据,比如内置库json、外部库Demjson、jsonpath,上一章节介绍了json库的使用方法(json库使用),本章主要介绍外部库jsonpath的使用
日常编码过程中遇到比较复杂的JSON数据,想要根批量提取自己想要的JSON数据里的内容,是比较麻烦的。JsonPath 模块正好能解决这类问题,JsonPath类似于XPath,支持选择器、过滤器和函数等功能,能够方便地从JSON数据中提取所需信息。
jsonpath安装
通过pip install jsonpath命令安装jsonpath库
jsonpath使用
通过from jsonpath import jsonpath导入所需模块
jsonpath()函数传入的对象是字典;如果是json字符串数据需要事先转换为字典。
- 使用时如果没有匹配到数据,返回False;
- 使用时如果匹配到数据,返回的是包含数据的列表list;
jsonpath语法
jsonpath的语法比较简单和直观。它使用点号(.)和方括号([])来访问JSON对象的属性和数组元素,下面是一些常用的jsonpath语法:
原字符 | 描述 |
$ | 表示根节点,是jsonpath表达式的开始 |
@ | 当前节点 |
. or [] | 子节点 |
.. | 递归搜索(搜索符合条件的所有数据) |
* | 通配符,表示所有的内容 |
[] | 支持访问数组,可以用于处理索引,元素等情况 |
[,] | 支持迭代器中做多选,多个key用逗号隔开 |
[start:end:step] | 数组分割操作,等同于切片 |
?() | 应用过滤表示式,一般与@结合使用 |
使用介绍
定义一个字典,存放用户的姓名/年龄/住址等信息。
from jsonpath import jsonpath
json_data = {"name":"userinfo",
"province":"js",
"users":[
{"name":"lili","age":21,
"address":["nj","jiangningqu","xixihuayuan"]},
{"name":"nana","age":20,
"address":["yz","qixiaqu","qinqinhuayuan"]},
{"name":"xinxin","age":21,
"address":["sz","yuhuataiqu","huiyuhuayuan"]}
]
}
- 使用$.users获取第1个节点users的全部信息
print(jsonpath(json_data,'$.users'))
#结果如下
[[{'name': 'lili', 'age': 21, 'address': ['nj', 'jiangningqu', 'xixihuayuan']},
{'name': 'nana', 'age': 20, 'address': ['yz', 'qixiaqu', 'qinqinhuayuan']},
{'name': 'xinxin', 'age': 21, 'address': ['sz', 'yuhuataiqu', 'huiyuhuayuan']}]]
- 使用$.users[*]获取users对应数组内所有的数据
print(jsonpath(json_data,'$.users[*]'))
#结果如下: 可以发现该结果返回的列表比上面的少一个[]
[{'name': 'lili', 'age': 21, 'address': ['nj', 'jiangningqu', 'xixihuayuan']},
{'name': 'nana', 'age': 20, 'address': ['yz', 'qixiaqu', 'qinqinhuayuan']},
{'name': 'xinxin', 'age': 21, 'address': ['sz', 'yuhuataiqu', 'huiyuhuayuan']}]
- 使用$.users[0,2]获取users的数组内第1和第3个数据
print(jsonpath(json_data,'$.users[0,2]'))
#结果如下
[{'name': 'lili', 'age': 21, 'address': ['nj', 'jiangningqu', 'xixihuayuan']}, {'name': 'xinxin', 'age': 21, 'address': ['sz', 'yuhuataiqu', 'huiyuhuayuan']}]
- 使用$.users.[name]获取数组内所有的name的值
print(jsonpath(json_data,'$.users.[name]'))
#结果如下
['lili', 'nana', 'xinxin']
- 使用$.users[0].name获取数组第1个索引对应的name
print(jsonpath(json_data,'$.users[0].name'))
#结果如下
['lili']
- 使用'$..name'获取所有key为name的值
print(jsonpath(json_data,'$..name'))
#结果如下
['userinfo', 'lili', 'nana', 'xinxin']
- 使用$.users..age获取users对应数组内所有age的值
print(jsonpath(json_data,'$.users..age'))
#结果如下
[21, 20, 21]
如果明确知道users的数组的层级关系,使用jsonpath(json_data,'$.users.[*][age]')等同于上面的查找结果
JSONPATH的过滤器
JSONPATH还支持使用过滤器来对JSON数据进行更精细的查询和过滤。过滤器中使用方括号[]中的表达式来指定过滤条件。下面是一些常见的过滤器:
==:等于
!=:不等于
<:小于
<=:小于或等于
>:大于
>=:大于或等于
=~:正则表达式匹配
!~:不匹配正则表达式
- 使用$.users[(@.length-1)]过滤数组最后一条数据
print(jsonpath(json_data,'$.users[(@.length-1)]'))
#结果如下
[{'name': 'xinxin', 'age': 21, 'address': ['sz', 'yuhuataiqu', 'huiyuhuayuan']}]
- 使用$.users.[?(@.age==20)]过滤数组中age等于20的数据
print(jsonpath(json_data,'$.users.[?(@.age==20)]'))
#结果如下
[{'name': 'nana', 'age': 20, 'address': ['yz', 'qixiaqu', 'qinqinhuayuan']}]
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
猜你喜欢
- 2024-09-18 PHP 解决json中文自动转换Unicode编码问题
- 2024-09-18 解锁数据存储的新维度:探索 PostgreSQL 中的JSON和数组特性!
- 2024-09-18 php读取数据库数据,并以json格式返回数据
- 2024-09-18 超详细的mysql数据库json字段类型语法大全
- 2024-09-18 从零学编程-JSON处理(json怎么学)
- 2024-09-18 灵活导出:如何将Excel数据转换为JSON对象格式
- 2024-09-18 如何把destoon数据生成json(如何在excel中随机生成一定范围内的数据)
- 2024-09-18 JSON概念(json基础知识)
- 2024-09-18 php返回json数据中文显示的问题(php返回json数据中文显示的问题怎么解决)
- 2024-09-18 javascript把二维数组转为json格式的字符串代码
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)