利用jmespath对json数据进行处理
相关文档
安装
pip3 install jmespath
基本使用
jmespath.search(expression, data, options=None)
- expression: jmespath 表达式
- data:需要提取的数据dict
import jmespath
import json
data = {'foo': {'bar': 'baz'}} # dict
data1 = '{"foo": {"bar": "baz"}}' # json str
data2 = json.loads(data1) # dict
expr = 'foo.bar'
print(jmespath.search(expr, data))
print(jmespath.search(expr, data1))
print(jmespath.search(expr, data2))
------输出结果-------
baz
None
baz
- 同re模块相似,也可以先编译compile jmespath 表达式再提取
import jmespath
import json
data = {'foo': {'bar': 'baz'}} # dict
data1 = '{"foo": {"bar": "baz"}}' # json str
data2 = json.loads(data1)
data2.update({'foo': {'bar': 'baz1'}}) # dict
expr = 'foo.bar'
expr = jmespath.compile(expr)
print(expr.search(data))
print(expr.search(data1))
print(expr.search(data2)) # 使用相同的jmespath表达式提取不同的数据
- 使用options参数来控制输出,如使用
options=jmespath.Options(dict_cls=collections.OrderedDict)
来控制输出字典的输出(当输出是字典时) - 如果未匹配到结果,则返回None
jmespath expression
通过上面的简单使用,提取json数据的关键在于jmespath expression表达式的编写,可参考JMESPath Tutorial中的示例。这一点跟jsonpath库其实很类似,根据个人喜欢选择即可
- 基本表达式Basic Expressions:提取字典中的key
- 使用
.
表达式提取子字典中的值如a.b.c
- 对于list结构数据支持索引如
a.b.c[0].d[1][0]
- 使用
- 切片Slicing:针对list结构数据支持切片
- 映射Projections
- List Projections和Slice Projections如
people[*].first
或people[:2].first
(people的值为list结构) - Object Projections如
ops.*.numArgs
(ops的值为dict结构) - Flatten Projections展平映射,如使用
[]
来展平嵌套列表,可多次使用展平多层嵌套列表 - Filter Projections使用
[? <expression> <comparator> <expression>]
如machines[?state=='running'].name
- List Projections和Slice Projections如
- 管道表达式Pipe Expressions如
people[*].first | [0]
- 多选MultiSelect如
people[].[name, state.name]
或people[].{Name: name, State: state.name}
- 函数Functions如
length(people)
,更多可参看Functions Expressions
测试站点
总结
- json数据的处理常用于接口自动化中的响应json数据的字段提取,如接口自动化框架httprunner就使用了JMESPath库