jmespath系列之1:入门篇

jmespath产品文档: https://jmespath.org/tutorial.html

jmespath调试器:https://jmespath.org

 

是JSON的查询语言,可以快速解析复杂的JSON数据,通过定义jmespath,可以将数据提取、数据筛选和数据格式转换一步完成

 

 

① 找到locations字段下的数据, 过滤state == 'WA'  的数据, 提取name字段

② 将结果数据传递给sort函数进行排序

③ 将排序后的数据, 传递给join函数, 转换格式, 填到新的字典中, 返回新的数据. 

各步骤的数据转化如下图:

 

 

数据提取功能

一、基本表达式:

JMESPath 使用 '.' 来获取JSON数据中下一层级别的数据. 使用[index]坐标来获取数组中对应位置的数据

 

 二、切片:

对于数组类型的数据, 支持像python一样格式的切片方式[start:end:step].

 三、通配符

  jmespath 中支持将*作为通配符,匹配所有元素

 

 四、管道符

jmespath 中的管道符作用和shell命令中的作用一样, 将前一个表达式返回的结果作为后一个表达式的输入进行计算

In [5]: search('*.two[0]', data)
Out[5]: []

In [6]: search('*.two | [0]', data)
Out[6]: 'bai'

第一个示例中:我们想获取第一个two字段对应的value, 不能直接使用two[0], 因为它的意思是获取two的第一个元素, two字段的数据不是列表,所以返回的是null.

第二个示例中:使用管道符将*.two表达式的返回 ['bai', 'pang', 'Gado'] 传给后面的表达式 [0] 从而获取到第一个元素 'bai'

五、多字段提取 [] {}

通过 [index] 从 JSON 数据中抽取我们需要的元素. 通过使用 多选列表[]多选hash {}, 可以创建 原始JSON数据不存在的 元素
1、多选列表

 
In [1]: from jmespath import search
 
In [2]: data = {
   ...:   "people": [
   ...:     {"name": "a", "state": {"name": "up"} },
   ...:     {"name": "b", "state": {"name": "down"} },
   ...:     {"name": "c", "state": {"name": "up"} }
   ...:   ]
   ...: }
 
In [3]: search('people[].[name, state.name]', data)
Out[3]: [['a', 'up'], ['b', 'down'], ['c', 'up']]

[name, state.name]部分是一个多选列表。它要创建一个包含两个元素的列表,第一个元素是name表达式的结果,第二个元素是state.name的结果。

2、多选hash{}

In [4]: search('people[].{new_name: name, state_name: state.name}', data)
Out[4]:
[{'new_name': 'a', 'state_name': 'up'},
 {'new_name': 'b', 'state_name': 'down'},
 {'new_name': 'c', 'state_name': 'up'}]

{new_name: name, state_name: state.name}部分是一个多选字典。它要创建一个包含两个元素的字典,第一个元素key是'new_name', value是name表达式的结果,第二个元素key是'state_name', value是state.name的结果


利用这个特性, jmespath可以轻松处理例如替换掉JSON数据的key的操作.

 

posted @ 2022-05-30 17:50  xiaoyanhahaha  阅读(167)  评论(0编辑  收藏  举报