Python中jmespath解析提取json数据

        在做接口自动化,测试断言时,我们经常需要提取接口的的响应数据字段,以前用过jsonpath,有几篇相关文章,可以参考下(Python深层解析json数据之JsonPath、【Jmeter篇】后置处理器之正则提取器、Json提取器 、Jmeter之json提取器实战(二)、Jmeter之json条件提取实战(三) )今天我们来介绍下jmespath用法,可以帮我们进行数据的灵活提取,下面通过案例来说明jmespath在python的使用。

jmespath官方文档

https://jmespath.org/tutorial.html#projections

jmespath安装

pip install jmespath

aa1953d507197441acc9a3a473842829.png

字典,通过key名称提取

import jmespath
dict_1 = {"a": "foo", "b": "bar", "c": "baz"}
print(jmespath.search("c",dict_1))baz

嵌套字典,层级提取

import jmespath
dict_1 = {"a": {"b": {"c": {"d": "value"}}}}
print(jmespath.search("a.b.c.d",dict_1))valueimport jmespath
dict_1 = {"a": {"b": {"c": {"d": "value"}}}}
print(jmespath.search("a.b.c",dict_1)){'d': 'value'}

列表,通过索引提取

import jmespath
list_1 = ["a", "b", "c", "d", "e", "f"]
print(jmespath.search("[1]",list_1))b

列表、字典嵌套提取

import jmespath
source = {"a": {"b": {"c": [{"d": [0, [1, 2]]},{"d": [3, 4]}]}
}}
print(jmespath.search("a.b.c[0].d[1][0]",source))1

切片提取列表中值

import jmespath
source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(jmespath.search("[0:5]",source))[0, 1, 2, 3, 4]import jmespath
source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(jmespath.search("[5:10]",source))[5, 6, 7, 8, 9]import jmespath
source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(jmespath.search("[:5]",source))[0, 1, 2, 3, 4]import jmespath
source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(jmespath.search("[::2]",source))[0, 2, 4, 6, 8]

列表取值使用 * 通配符

1、取出列表中所有 first对应的值

 people[*].first

import jmespath
source = {"people": [{"first": "James", "last": "d"},{"first": "Jacob", "last": "e"},{"first": "Jayden", "last": "f"},{"missing": "different"}],"foo": {"bar": "baz"}
}
print(jmespath.search("people[*].first",source))['James', 'Jacob', 'Jayden']

2、取出列表中前2个first 对应的值

people[:2].first

import jmespath
source = {"people": [{"first": "James", "last": "d"},{"first": "Jacob", "last": "e"},{"first": "Jayden", "last": "f"},{"missing": "different"}],"foo": {"bar": "baz"}
}
print(jmespath.search("people[:2].first",source))['James', 'Jacob']

对象取值使用 * 通配符

取出ops 对象的任意属性对应的numArgs值 ops.*.numArgs

import jmespath
source = {"ops": {"functionA": {"numArgs": 2},"functionB": {"numArgs": 3},"functionC": {"variadic": 1}}
}
print(jmespath.search("ops.*.numArgs",source))[2, 3]

子查询使用 * 通配符

在查询的结果中继续使用 * 通配符,查询的结果是列表的列表

import jmespath
source = {"reservations": [{"instances": [{"state": "running"},{"state": "stopped"}]},{"instances": [{"state": "terminated"},{"state": "running"}]}]
}
print(jmespath.search("reservations[*].instances[*].state",source))[['running', 'stopped'], ['terminated', 'running']]

我们希望结果为[“ running”, “ stopped”, “ terminated”, “ running”]一个状态列表,可以使用 [] 而不是 [*]

print(jmespath.search("reservations[].instances[].state",source))['running', 'stopped', 'terminated', 'running']

过滤器使用

过滤器表达式是为数组定义的,其一般形式为 [?<表达式> <比较器> <表达式>]。

常用的比较表达式可以使用 ==, !=, <, <=, >, > =

假设我们有一个设备列表,每个设备都有一个名称和一个 state。我们想要所有正在运行的计算机的名称

import jmespath
source = {"machines": [{"name": "a", "state": "running"},{"name": "b", "state": "stopped"},{"name": "b", "state": "running"}]
}
print(jmespath.search("machines[?state=='running'].name",source))['a', 'b']

管道表达式

前面在匹配list里面的多个值时候,查询的结果是一个list,如果我想取出结果里面的第一个可以使用管道符 |

取出people下所有对象的 first 属性,从结果里面取第一个值:people[*].first | [0]

import jmespath
source = {"people": [{"first": "James", "last": "d"},{"first": "Jacob", "last": "e"},{"first": "Jayden", "last": "f"},{"missing": "different"}],"foo": {"bar": "baz"}
}
print(jmespath.search("people[*].first | [0]",source))James

多选列表创建一个列表

到目前为止,我们已经研究了JMESPath表达式,这些表达式有助于将JSON文档缩减为您感兴趣的元素。下一个概念, 多选列表和 多选哈希允许您创建JSON元素。这使您可以创建JSON文档中不存在的元素。多选列表创建一个列表,多选哈希创建一个JSON对象。

这是一个多选列表的示例:people[].[name, state.name]

import jmespath
source = {"people": [{"name": "a","state": {"name": "up"}},{"name": "b","state": {"name": "down"}},{"name": "c","state": {"name": "up"}}]
}
print(jmespath.search("people[].[name, state.name]",source))[['a', 'up'], ['b', 'down'], ['c', 'up']]

在上面的表达式中,[name, state.name]部分是一个多选列表。它说要创建一个由两个元素组成的列表,第一个元素是针对list元素评估名称表达式的结果,第二个元素是对state.name评估的结果。因此,每个列表元素将创建一个两个元素列表,并且整个表达式的最终结果是两个元素列表的列表。

与投影不同,即使结果为null,也始终包含表达式的结果。如果将以上表达式更改为people []。[foo, bar],则每个两个元素列表将为[null, null]。

多重选择具有与多重选择列表相同的基本概念,不同之处在于它会创建哈希而不是数组。使用上面的相同示例,如果我们想创建一个具有两个键Name和 State的两个元素哈希,则可以使用以下代码:

import jmespath
source = {"people": [{"name": "a","state": {"name": "up"}},{"name": "b","state": {"name": "down"}},{"name": "c","state": {"name": "up"}}]
}
print(jmespath.search("people[].{Name: name, State: state.name}",source))[{'Name': 'a', 'State': 'up'}, {'Name': 'b', 'State': 'down'}, {'Name': 'c', 'State': 'up'}]

函数的使用

JMESPath支持函数表达式,例如:length(people)

import jmespath
source = {"people": [{"name": "b","age": 30,"state": {"name": "up"}},{"name": "a","age": 50,"state": {"name": "down"}},{"name": "c","age": 40,"state": {"name": "up"}}]
}
print(jmespath.search("length(people)",source))3

函数可用于以强大的方式转换和过滤数据。可以在此处找到函数的完整列表,并且 函数表达式规范具有完整的详细信息。

以下是一些功能示例。

本示例在people数组中打印最老的人的名字:

import jmespath
source = {"people": [{"name": "b","age": 30},{"name": "a","age": 50},{"name": "c","age": 40}]
}
print(jmespath.search("max_by(people, &age).name",source))a

函数也可以与过滤器表达式组合。在下面的示例中,JMESPath表达式在myarray中查找包含字符串foo的所有元素。

import jmespath
source = {"myarray": ["foo","foobar","barfoo","bar","baz","barbaz","barfoobaz"]
}
print(jmespath.search("myarray[?contains(@, 'foo') == `true`]",source))['foo', 'foobar', 'barfoo', 'barfoobaz']

场景一,接口响应数据,提取code、msg、status字段进行断言

source = {"code": 0,"msg": "成功","trace": "ad12de4","data": {"total": 205,"list": [{"id": 15000087,"name": "促销员","job_nature": 2,"category_id": 61,"user_id": 589601,"company_id": 5084,"group_id": 5084,"status": 4,"audit_type": 0,"company_name": "二十二门店","job_nature_zh": "兼职","salary_zh": "1000元\/时","show_status": 5,"manage_status_reason": "","status_zh": "停招","browse_users_num": 0,"communication_users_num": 0,"sign_up_users_num": 0,"job_card_time_remaining": 22,"job_top_card_time_remaining": 0}, {"id": 15000078,"name": "促销员","job_nature": 1,"category_id": 61,"user_id": 589601,"company_id": 1000064,"group_id": 5084,"status": 4,"audit_type": 100,"company_name": "二十二门店","job_nature_zh": "全职","salary_zh": "2000-3000元\/月","show_status": 6,"manage_status_reason": "","status_zh": "停招","browse_users_num": 0,"communication_users_num": 0,"sign_up_users_num": 0,"job_card_time_remaining": 0,"job_top_card_time_remaining": 0}, {"id": 15000077,"name": "促销员","job_nature": 1,"category_id": 61,"user_id": 589601,"company_id": 5084,"group_id": 5084,"status": 4,"audit_type": 100,"company_name": "二十二门店","job_nature_zh": "全职","salary_zh": "2000-3000元\/月","show_status": 2,"manage_status_reason": "","status_zh": "停招","browse_users_num": 0,"communication_users_num": 0,"sign_up_users_num": 0,"job_card_time_remaining": 0,"job_top_card_time_remaining": 0}, {"id": 13076362,"name": "收银员","job_nature": 2,"category_id": 97,"user_id": 589601,"company_id": 5084,"group_id": 5084,"status": 4,"audit_type": 1,"company_name": "二十二门店","job_nature_zh": "兼职","salary_zh": "1000元\/时","show_status": 2,"manage_status_reason": "","status_zh": "停招","browse_users_num": 0,"communication_users_num": 0,"sign_up_users_num": 0,"job_card_time_remaining": 0,"job_top_card_time_remaining": 0}, {"id": 13076361,"name": "品类管理","job_nature": 1,"category_id": 102,"user_id": 589601,"company_id": 5084,"group_id": 5084,"status": 1,"audit_type": 1,"company_name": "二十二门店","job_nature_zh": "全职","salary_zh": "2000-3000元\/月","show_status": 1,"manage_status_reason": "","status_zh": "招聘中","browse_users_num": 3,"communication_users_num": 1,"sign_up_users_num": 1,"job_card_time_remaining": 342,"job_top_card_time_remaining": 0}]}
}print(jmespath.search("code",source)) # 0
print(jmespath.search("msg",source)) # 成功
print(jmespath.search("data.list[].status",source))  # [4, 4, 4, 4, 1]

场景二,接口响应数据,提取列表类模块某字段进行断言

import jmespath
source = [{"Name": "晨练指数","ID": 100,"Ascending": 1,"LocalDateTime": "2021-11-11T07:00:00+08:00","EpochDateTime": 1636585200,"Value": 4.0,"Category": "不宜","CategoryValue": 4,"MobileLink": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn","Link": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn"
}, {"Name": "穿衣指数","ID": 101,"Ascending": 1,"LocalDateTime": "2021-11-11T07:00:00+08:00","EpochDateTime": 1636585200,"Value": 5.0,"Category": "初冬装","CategoryValue": 5,"MobileLink": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn","Link": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn"
}, {"Name": "感冒指数","ID": 102,"Ascending": 1,"LocalDateTime": "2021-11-11T07:00:00+08:00","EpochDateTime": 1636585200,"Value": 2.0,"Category": "较易发","CategoryValue": 2,"MobileLink": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn","Link": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn"
}]print(jmespath.search("[].Name",source)) ['晨练指数', '穿衣指数', '感冒指数']

5f6cfd52804322ad58b4baf9387629a6.png

e4d630627ee08dee8561a184f794575d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SVM学习记录

第一个min&#xff1a;先在数据中找离决策边界距离最近的样本点 第二个max&#xff1a;寻找w和b使得刚才找到的点离决策边界最远的平面&#xff08;平面方程&#xff1a;&#xff09; 求解出后即可求出w和b。 例如&#xff1a; 如果等于0.根据上面的公式&#xff0c;得到w就为…

缺陷定位 | 测试发现了Bug,还要分析定位Bug?(一)

hello今天分享的内容&#xff0c;可能会有很多朋友持不同观点&#xff0c;或被很多同行朋友diss&#xff0c;不过没关系&#xff0c;即使被喷被diss&#xff0c;我依然会坚持我的观点&#xff0c;把最真实的干货分享给大家&#xff0c;希望得到支持。测试工程师在互联网行业里&…

opencv glob 内存溢出异常

先贴代码(非常简单的代码&#xff09; #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp" #include "opencv2/ml.hpp" #include "opencv2/objdetect.hpp" #include <iostream> #include <time.h> using na…

白盒测试 | 用例设计方法之条件组合覆盖

往期关联文章回顾&#xff1a;白盒测试 | 用例设计方法之条件覆盖白盒测试 | 用例设计方法之判定覆盖白盒测试 | 用例设计方法之语句覆盖条件组合覆盖&#xff1a;列出所有判定条件中可能的取值组合&#xff0c;使得每个判定条件结果的所有可能组合至少出现一次程序流程图&…

npm安装教程

一、使用之前&#xff0c;我们先来掌握3个东西是用来干什么的。 npm: Nodejs下的包管理器。 webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备&#xff0c;比如资源的合并和打包。 vue-cli: 用户生成Vue工程模板。&#xff08;帮你快…

测试管理 | 测试经理定义和实施测试度量

往期关联文章回顾&#xff1a;瀑布、V、W、快速原型模型、增量、螺旋模型测试管理 | 4种优先级排序方法一定要掌握测试管理 | 基于风险的测试管理上有这样一句名言&#xff0c;进行度量的工作才会得到有效的执行。反之&#xff0c;因为很容易忽略那些不进行度量的工作&#xff…

Python核心场景自动化测试项目实战(二)

往期关联文章回顾&#xff1a;PytestAllureJenkins接口自动化项目实战&#xff08;一&#xff09;【Python篇】核心场景接口自动化方案&#xff08;一&#xff09;以前我们用pythonunittestHTMLTestRunnerjenkins结合实际项目写过一个核心场景自动化测试&#xff0c;也在实际工…

opencv图像切割1-KMeans方法

kMeans随机数据分类&#xff1a; #include<opencv2\opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main1() {Mat img(500, 500, CV_8UC3);RNG rng(12345);Scalar colorTab[] {Scalar(0,0,255),Scalar(0,255,0),Scalar(255,0,0),…

mitmproxy抓包 | Python疑难测试场景mock

往期经典文章回顾&#xff1a;抓包工具mitmproxy环境配置使用&#xff08;一&#xff09;抓包工具mitmproxy | mitmweb基本用法&#xff08;二&#xff09;mitmproxy抓包 | Python实时生成接口自动化用例mitmproxy抓包 | Python实时生成接口自动化用例&#xff08;三&#xff0…

opencv图像分割2-GMM

GMM随机数分类&#xff1a; #include<opencv2\opencv.hpp> #include<iostream> using namespace cv; using namespace std; using namespace cv::ml; int main() {Mat imgMat::zeros(500, 500, CV_8UC3);RNG rng(12345);Scalar colorTab[] {Scalar(0,0,255),Scal…

mitmproxy抓包 | Python疑难测试场景mock实战(四)

往期经典文章回顾&#xff1a;抓包工具mitmproxy环境配置使用&#xff08;一&#xff09;抓包工具mitmproxy | mitmweb基本用法&#xff08;二&#xff09;mitmproxy抓包 | Python实时生成接口自动化用例mitmproxy抓包 | Python实时生成接口自动化用例&#xff08;三&#xff0…

mitmproxy抓包 | Python篡改请求参数实战(五)

抓包工具mitmproxy环境配置使用&#xff08;一&#xff09;抓包工具mitmproxy | mitmweb基本用法&#xff08;二&#xff09;mitmproxy抓包 | Python实时生成接口自动化用例&#xff08;三&#xff09;mitmproxy抓包 | Python实时生成接口自动化用例mitmproxy抓包 | Python疑难…

数据结构-链表1-顺序存储

DynamicArray.h #ifndef DYNAMIC_ARRAY_H #define DYNAMIC_ARRAY_H #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h>//动态数组结构体 typedef struct DYNAMICARRAY {int* pAddr; //具体存放数据的地址int size…

全网都在用的超全【面试刷题小程序】,最新版激活教程

前几天&#xff0c;我的一个粉丝留言给我说&#xff0c;他在面试美团的自动化测试岗的时候&#xff0c;不幸挂掉了。越想越觉得可惜&#xff0c;回想面试经过&#xff0c;好好总结了几个点&#xff0c;发现面试没过的主要原因是在几个关键的问题没有给到面试官想要的答案。从而…

数据结构-链表2-链式存储

LinkList.h #ifndef LINKLIST_H #define LINKLIST_H #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h>//链表结点 typedef struct LINKNODE {void* data; //无类型指针&#xff0c;指向任何类型的数据struct LIN…

字节内部自动化测试培训资料,明年涨薪用得上

今天是12月27日&#xff0c;2021年还剩下最后4天。昨晚我收到一位粉丝朋友的涨薪喜讯&#xff0c;他踩着2021的尾巴&#xff0c;成功跳进广州海珠的互联网巨头&#xff0c;涨薪幅度达284%。其实每年的年末&#xff0c;圈子里的朋友都特别忙&#xff0c;大家都在为来年跳槽做准备…

数据结构-链表3-循环链表

LinkList.h #ifndef LINKLIST_H #define LINKLIST_H #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h>//链表小结点 typedef struct CIRCLELINKNODE {struct LinkNode *next; }CircleLinkNode;//链表结构体 type…

探索篇 | 接口字段容错测试(三)

往期关联文章&#xff1a;探索测试 | 新奇深层测试策略之案例剖析&#xff08;一&#xff09;探索篇 | 新奇测试策略剖析&#xff0c;大家都觉得多此一举(二)探索篇|越权测试策略之案例剖析&#xff08;一&#xff09;重磅福利 | 全网唯一,多年踩坑经验&#xff0c;探索测试策略…

数据结构-链表4-企业链表

LinkList.h #ifndef LINKLIST_H #define LINKLIST_H#include<stdio.h> #include<stdlib.h> //链表结点 typedef struct LINKNODE {struct LINKNODE *next; }LinkNode;//链表 typedef struct LINKLIST{LinkNode head; //放在第一个&#xff0c;防止有偏移量.//不…

全网都在看的Jmeter精选原创文章

点击上方“蓝字”&#xff0c;轻松关注我们Jmeter 原创合集‍‍‍‍‍‍‍1、【Jmeter篇】Linux环境下安装部署运行Jmeter2、Jmeter跨线程组传递参数3、Jmeter中JDBC Connection Configuration实现MySQL JDBC Request数据库处理4、Jmeter JDBC Request执行多条SQL语句5、Jmeter…