6.jmespath表达式
阅读原文时间:2023年07月08日阅读:2

jmespath是json的查询语言

可以从json文档中提取和转换元素,类似于jsonpath的另外一个库

字典取值

# 一层嵌套取值
{a:1,b:2,c:3}
"""
取a的值:a
"""

# 多层嵌套取值

# 多层嵌套取值
{a:{b:3,c:4,d:{e:1}}}
"""
取a的值:a
取b的值:a.b
取e的值:a.d.e
"""

列表通过下标取值

#跟python一样,通过下标取值
[a,b,c,d,e]
"""
取a的值:[0]
"""

字典套列表取值

{a:{
    b:{
        c:[
            {d:[0,[1,2]]},
            {e:[3,4]}
        ]
    }
}
}
"""
取d里面为0的值:a.b.c[0].d[0]
取d里面为1的值: a.b.c[0].d[1][0]
"""

切片取值

[0,1,2,3,4,5,6,7]
"""
与python切片一致:启点位置:终点位置:步长
取1~4的值:[1:5]
"""

列表*通配符

{
    a:[
        {b:1,sss:3},
        {c:2,sss:3},
        {d:3,sss:3}
    ]
}
"""
取值列表中所有的key为sss的值:a[*].sss
取出列表中前二个sss对应的值:a[:2].sss
"""

对象*通配符取值

{
    ops:{
        fcA:{num:1},
        fcb:{num:2},
        fcc:{sss:2}
    }
}

"""
取出所有包含num的值:ops.*.num
"""

过滤器

过滤器表达式是为数组定义的

一般形式为:[? <表达式><比较器><表达式>]
常用的比较表达式:==,!=,<,<=,>,>=

{
    lable:[
        {name:a,state:run},
        {name:b,state:stop},
        {name:c,state:run}
    ]
}

"""
字符串必须用单引号
假设有3台机器,我们想要拿出所有正在运行的机器的名称
lable[?state=='run'].name

"""

管道|表达式

匹配list里面的多个值的时候,查询的结果是一个list,如果我想取出结果里面的指的的值可以使用管道符

{
    a:[
        {name:1,sss:3},
        {name:2,sss:3},
        {name:3,sss:3}
    ]
}
"""
取出a下面所有对象的name属性,从结果里面取第一个值
a.[*].name |[0]]
"""

多选取值

{
    a:[
        {name:1,state:{sss:3},
        {name:2,state:{sss:3},
        {name:3,state:{sss:3}
    ]
}
"""
取出a里面所有的name的值 和sss的值,多个值用逗号隔开
[]是列表所有的值
a.[].[name,state.sss]
"""

取值数量length

{
    a:[
        {name:1,state:{sss:3},
        {name:2,state:{sss:3},
        {name:3,state:{sss:3}
    ]
}

"""
取出所有的name值,获取name值的数量
length(a.name)

"""

max_by最大值

{
    people:[
        {name:a,age:18},
        {name:b,age:19},
        {name:c,age:29}
    ]
}
"""
取出age的最大值的name
max_by(people,&age).name
"""

min_by最小值

{
    people:[
        {name:a,age:18},
        {name:b,age:19},
        {name:c,age:29}
    ]
}
"""
取出age的最小值的name
min_by(people,&age).name
"""

函数也可以和过滤器表达式组合

@字符表示在对象中正在评估的当前元素,如果包含条件,则返回true

{
    myattay:[
        foo,
        foobar,
        bar,
        baz
    ]

}

"""
在myarray中查询包含字符串foo的元素
myarray[?contaisn(@,'foo')==`true`]
"""

字符串使用单引号''

数值或其他类型使用``

python中使用jmespath

安装:pip3 install jmespath

search(表达式,数据)

#使用search jmespath表达式提供数据
body = {'code':0,data:[{name:a,age:1},{name:b,age:2}]}

import jmespath
#取出code
path = jmespath.search('code',body)
#取出第一个name
path = jmespath.search('data[0].name',body)
#取出name=a的数据
path = jmespath.search("data[?name='a']",body)
#取出年龄大于20的1数量
path = jmespath.search("length(data[?age>`20`])")

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章