概要
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,目前被广泛应用,在实际使用过程中不管是开发工程师还是测试工程师都必须学会json数据的处理。
Python中有几个库可以比较好的处理json数据,比如内置库json、外部库Demjson、jsonpath,上一章节介绍了json库的使用方法(json库使用),本章主要介绍外部库jsonpath的使用
日常编码过程中遇到比较复杂的JSON数据,想要根批量提取自己想要的JSON数据里的内容,是比较麻烦的。JsonPath 模块正好能解决这类问题,JsonPath类似于XPath,支持选择器、过滤器和函数等功能,能够方便地从JSON数据中提取所需信息。
学习目录
jsonpath安装
jsonpath使用
jsonpath语法
使用介绍
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']}]
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。