那些年遇到的取数场景
目标1:取AA的值(第1层数据):
参数正常返回:
dic = {"AA": {"BB": {"CC": 666}}}
dic["AA"] -- 够用?
参数未正常返回:
dic = {"AAA": {"BB": {"CC": 666}}}
dic["AA"] -- 找不到报错:KeyError: 'AA' ---淘汰❌
dic.get("AA") -- 找不到返回None,新欢✅
目标2:取BB的值(第2层数据)
第1层数据正常返回:
dic = {"AA": {"BB": {"CC": 666}}}
dic.get("AA").get("BB") -- 够用?
第1层数据未正常返回:
dic = {"AAA": {"BB": {"CC": 666}}}
dic.get("AA").get("BB") -- 找不到报错:AttributeError: 'NoneType' object has no attribute 'get' ---淘汰❌
jmespath.search("AA.BB", dic) -- 表达式查询,查不到就返回None,妈妈再也不用担心我取值报错啦????
上干货⬇️⬇️⬇️⬇️⬇️⬇️⬇️
1. jmespath 三方依赖包安装
pip install jmespath
2. jmespath使用语法
jmespath.search("AA.BB", dic)
jmespath.search("*.BB", dic)
AA.BB -- 表达式
dic -- 变量名
一般的取数用A.B.C、*.C就足够了,如果你还想进阶的话!! ⬇️⬇️⬇️⬇️⬇️
3. 表达式支持的操作符:
- 点操作符(.): 用于访问JSON对象中的属性或数组中的元素。
- 方括号操作符([]): 用于访问JSON数组中的元素,可以使用索引、迭代和过滤数组。
- 通配符(*)和多级通配符(**): 用于匹配任意层级的属性或数组元素。
- 过滤器(?): 用于根据条件过滤数组元素。
- 比较操作符: 支持等于(==)、不等于(!=)、小于(<)、小于等于(<=)、大于(>)和大于等于(>=)等比较操作符。
- 逻辑操作符: 支持与(and)、或(or)和非(not)等逻辑操作符。
dic = {
"students": [
{
"name": "Alice",
"age": 18,
"grades": {
"math": 90,
"english": 85,
"science": 92
}
},
{
"name": "Bob",
"age": 20,
"grades": {
"math": 75,
"english": 88,
"science": 80
}
},
{
"name": "Charlie",
"age": 19,
"grades": {
"math": 85,
"english": 92,
"science": 78
}
}
]
}
1.提取所有学生的名字和年龄:
students[].{ "name": name, "age": age }
2.提取分数大于90分的学生姓名:
students[?grades.math > 90].name
3.提取所有学生的平均分数:
students[].{ "name": name, "average_grade": (grades.math + grades.english + grades.science) / 3}
4.提取平均分数最高的学生姓名:
students[].{"name": name, "average_grade": (grades.math + grades.english + grades.science) / 3} | max_by(@, &average_grade).name
5.提取每个科目的最高分数:
{"math": max(students[].grades.math),"english": max(students[].grades.english),"science": max(students[].grades.science)}
6.提取年龄在18到20之间的学生姓名:
students[age >= 18
&& age <= 20
].name
欢迎来到testingpai.com!
注册 关于