前言前面学了 jsonpath 可以很好的解析 json 数据,提取出我们想要的内容,对于平常的基本工作没太大的问题,但有一点点小遗憾。 JMESPath 简介JMESPath 是 JSON的查询语言,您可以从JSON文档中提取和转换元素,类似于 jsonpath 的另外一个库。
使用示例1,可以使用 import jmespath
path = jmespath.search('foo.bar', {'foo': {'bar': 'baz'}})
print(path) # baz 使用示例2, 与re模块类似,您可以使用该 import jmespath
expression = jmespath.compile('foo.bar')
a = expression.search({'foo': {'bar': 'baz'}})
b = expression.search({'foo': {'bar': 'other'}})
print(a) # baz
print(b) # other 基本表达式字典取值,根据key名称取到对应的值 嵌套的字典,可以一层一层取值 list可以根据下标取值 dict嵌套list可以一层一层的取值 切片如果您曾经在python中使用过切片,那么您已经知道如何使用JMESPath slice。 该切片结果包含元素0、1、2、3和4。不包括索引5的元素。如果要选择数组的后半部分,可以使用以下表达式: 上面的两个示例可以简化。如果开始或步骤被省略值它被假定为开始或数组的末尾。例如: 切片的一般形式是[start:stop:step]。到目前为止,我们已经研究了[start:stop]表单。缺省情况下,步骤值是1,这是指包括在由所指定的范围中的每个元素开始和 停止值。但是,我们可以使用step值跳过元素。例如,仅从数组中选择偶数元素。 还要注意在这个例子中,我们省略开始还有停止 值,使用该装置0的启动值,10为 停止值。在此示例中,表达式[:: 2]等效于 [0:10:2]。 上面的表达式创建一个切片,但顺序相反。 列表取值使用 * 通配符1.取出列表中所有的 first 对应的名称 2.取出列表中前 2 个 first 对应的名称 对象取值使用 * 通配符1.取出 ops 对象的任意属性对应的numArgs 子查询使用 * 通配符在查询的结果中继续使用 * 通配符,查询的结果是列表的列表 如果我们只想要一个实例所有状态的列表怎么办?理想情况下,我们希望结果为[“ running”, “ stopped”, “ terminated”, “ running”] 过滤器使用过滤器表达式是为数组定义的,其一般形式为 假设我们有一个机器列表,每个机器都有一个名称和一个 state。我们想要所有正在运行的计算机的名称 管道表达式前面在匹配list里面的多个值时候,查询的结果是一个list,如果我想取出结果里面的第一个可以使用管道符 多选到目前为止,我们已经研究了JMESPath表达式,这些表达式有助于将JSON文档缩减为您感兴趣的元素。下一个概念, 多选列表和 多选哈希允许您创建JSON元素。这使您可以创建JSON文档中不存在的元素。多选列表创建一个列表,多选哈希创建一个JSON对象。 这是一个多选列表的示例: 在上面的表达式中,[name, state.name]部分是一个多选列表。它说要创建一个由两个元素组成的列表,第一个元素是针对list元素评估名称表达式的结果,第二个元素是对state.name评估的结果。因此,每个列表元素将创建一个两个元素列表,并且整个表达式的最终结果是两个元素列表的列表。 与投影不同,即使结果为null,也始终包含表达式的结果。如果将以上表达式更改为people []。[foo, bar],则每个两个元素列表将为[null, null]。 多重选择具有与多重选择列表相同的基本概念,不同之处在于它会创建哈希而不是数组。使用上面的相同示例,如果我们想创建一个具有两个键Name和 State的两个元素哈希,则可以使用以下代码: 函数的使用JMESPath支持函数表达式,例如:length(people) 函数可用于以强大的方式转换和过滤数据。可以在此处找到函数的完整列表,并且 函数表达式规范具有完整的详细信息。 以下是一些功能示例。 本示例在people数组中打印最老的人的名字: 函数也可以与过滤器表达式组合。在下面的示例中,JMESPath表达式在myarray中查找包含字符串foo的所有元素。 上面示例中的@字符表示在myarray中正在评估的当前元素。如果myarray数组中的当前元素包含字符串 foo , 则包含(@,’foo’)的表达式将返回 true。 尽管函数表达式规范包含所有详细信息,但在使用函数时,需要牢记以下几点: 函数参数具有类型。如果函数的参数类型错误,则会发生无效类型错误。有一些函数可以进行类型转换(to_string,to_number),以帮助将参数转换为正确的类型。 2021年第六期《python接口自动化+测试开发》课程,1月9号开学(火热报名中!) 本期上课时间:1月9号-4月18号,每周六、周日晚上20:30-22:30 |
|