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的操作.