龙空技术网

测开不得不会的python之jsonpath数据提取

科雷软件测试 77

前言:

现时同学们对“python输出数组的索引号”大概比较关注,姐妹们都想要学习一些“python输出数组的索引号”的相关内容。那么小编在网上网罗了一些对于“python输出数组的索引号””的相关文章,希望同学们能喜欢,小伙伴们快快来了解一下吧!

学习目录

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;使用时如果匹配到数据,返回的是包含数据的列表listjsonpath语法

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

原字符

描述

$

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

@

当前节点

. or []

子节点

..

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

*

通配符,表示所有的内容

[]

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

[,]

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

[start:end:step]

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

?()

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

使用介绍

定义一个字典,存放用户的姓名/年龄/住址等信息。

from jsonpath import jsonpathjson_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']}]

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

标签: #python输出数组的索引号 #json对象获取属性的方法 #json数据转换为对象数组 #python正则提取括号中数据 #pythonjson递归