ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

解析json数据--JMESPath模块

2021-01-24 03:02:14  阅读:235  来源: 互联网

标签:name people -- 列表 json 使用 JMESPath jmespath 表达式


第一part:JMESPath 简介

JMESPath 是 JSON的查询语言,可以从JSON文档中提取和转换元素,类似于 jsonpath 的另外一个库。
JMESPath 官方文档地址:https://jmespath.org/tutorial.html#basic-expressions
github地址https://github.com/jmespath/jmespath.py


第二part:python安装jmespath模块

pip install jmespath

 


第三part:python使用jmespath模块


jmespath.search(expression,data)方法的使用:其中参数expression为表达式,data为json数据。

在接口自动化中,可以使用该方法进行获取json的数据进行断言。

json数据为:

data={     "status": {         "code": 0,         "message": "ok"     } }
例如:

#导包
import jmespath

#返回joson数据中的status中的数据:

get_data=jmespath.search('status',data)
print(get_data)

运行结果:

 

 

 

第四part:基本表达式


1.字典取值,根据key名称取到对应

 

 

2.【嵌套的字典,通过一层一层取值】

 

 

 

3.【list(列表)通过下标取值】

 

 

4.【dict(字典)嵌套list(列表),通过一层一层的取值】

 

 

 

5.【切片】

切片与python中的字符串切片的使用方法是一致的,是通过索引来获取数据。

切片的一般形式是[start:stop:step]

注意:

start:开始索引,是包含的,为空,代表从0开始

stop:结束索引,是不包含的,为空,代表到最后一个;

step:步长,如果不传,默认为1

5.1 [0:5]

5.2 [5:10]

 

5.3  [:5],开始索引与步长均为空

 

5.4 [::2],开始与结束索引均为空,步长为2

 

 5.5 [::-1],步长值为负,则以相反顺序创建切片

 

 6.【列表取值使用 * 通配符

6.1.取出列表中所有的 first 对应的名称,使用表达式:people[*].first

 

 

6.2.取出列表中前 2 个 first 对应的名称,使用表达式:people[:2].first

 

 

7.【对象取值使用 * 通配符】

取出 ops 对象的任意属性对应的numArgs,使用表达式: ops.*.numArgs

 

8.【子查询使用 * 通配符】

8.1 在查询的结果中继续使用 * 通配符,查询的结果是列表的列表(列表嵌套列表)

 

 

 

 8.2 通常我们需要的结果是['running', 'stopped', 'terminated', 'running'],只需要一个列表的状态,则使用[],而不是[*]

9.【过滤器使用】

过滤器表达式是数组形式的,其一般形式为 [?<表达式> <比较器> <表达式>]
常用的比较表达式可以使用 ==, !=, <, <=, >, > =

9.1如下有一个机器列表,每个机器都有一个名称和一个 state,此时想要所有state为running的计算机的名称,使用表达式:machines[?state=='running'].name

 

10.【管道表达式】

前面在匹配list里面的多个值时候,查询的结果是一个list,如果需要取出结果里面的第n个可以使用管道符 |
例子:取出people下所有对象的 first 属性,从结果里面取第一个值,使用表达式:people[*].first | [0]

 

11.【多选】

多选列表和多选哈希创建JSON元素,可以创建JSON文档中不存在的元素。

多选列表创建一个列表,多选哈希创建一个JSON对象。

例子:取出people属性的name,以及state中的name值,使用表达式:people[].[name, state.name]

 

 

 

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

多重选择具有与多重选择列表相同的基本概念,不同之处在于它会创建哈希而不是数组。

使用上面的相同示例,如果我们想创建一个具有两个键Name和 State的两个元素哈希,则使用表达式:people[].{Name: name, State: state.name}

 

12.【函数的使用】

JMESPath支持函数表达式。

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

例子1:在people数组中打印数组的长度,使用表达式:

 

例子2:在people数组中打印最老的人的名字,使用表达式:max_by(people, &age).name

 

 

 

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

使用表达式:myarray[?contains(@, 'foo') == `true`]

 

 

 

 【解析】:

上面示例中的@字符表示在myarray中正在评估的当前元素。如果myarray数组中的当前元素包含字符串 foo , 则包含(@,’foo’)的表达式将返回 true。

尽管函数表达式规范包含所有详细信息,但在使用函数时,需要牢记以下几点:

函数参数具有类型。如果函数的参数类型错误,则会发生无效类型错误。有一些函数可以进行类型转换(to_string,to_number),以帮助将参数转换为正确的类型。

 

标签:name,people,--,列表,json,使用,JMESPath,jmespath,表达式
来源: https://www.cnblogs.com/smilecindy/p/14319819.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有