利用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[*].firstpeople[:2].first(people的值为list结构)
    • Object Projections如ops.*.numArgs(ops的值为dict结构)
    • Flatten Projections展平映射,如使用[]来展平嵌套列表,可多次使用展平多层嵌套列表
    • Filter Projections使用[? <expression> <comparator> <expression>]machines[?state=='running'].name
  • 管道表达式Pipe Expressions如people[*].first | [0]
  • 多选MultiSelect如people[].[name, state.name]people[].{Name: name, State: state.name}
  • 函数Functions如length(people),更多可参看Functions Expressions

测试站点

总结