【jmespath】—2. 进阶 List and Slice Projections
Projections翻译的话说实话我也不知道翻成什么比较准确,姑且就叫“投影”吧,不过带来的功能确实非常的强大、好用。

首先,我先说下我的理解:
- 通配符
* - 通配符生成的是一个list列表
- 通配符后面查找的元素都会放到这个list里
一、List and Slice Projections
列表和切片在projections中的应用。
1. 常见的接口数据返回
相信很多接口里返回的数据,在一个列表中嵌套了字典,而且每一个元素都是一个json对象,里面的key-value都是一样的,那如果你想拿到某一个key下的所有value要如何做呢?
import jmespath
dic_1 = {
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
path = jmespath.search("people[*]", dic_1)
print(path)
#运行结果
D:\Daily\whatisyeild>python jmespath_demo.py
[{'first': 'James', 'last': 'd'}, {'first': 'Jacob', 'last': 'e'}, {'first': 'Jayden', 'last': 'f'}, {'missing': 'different'}]
可以看到people[*]中的通配符 * 匹配了列表中的所有元素,并且以列表的形式返回。
那么这时候取key是first的值,只需要people[*].first。
import jmespath
dic_1 = {
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
path = jmespath.search("people[*].first", dic_1)
print(path)
#运行结果
D:\Daily\whatisyeild>python jmespath_demo.py
['James', 'Jacob', 'Jayden']
可以看到,查找到的元素同样被放到了通配符创建的列表里,并返回。
同样,你也可以切片:
import jmespath
dic_1 = {
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
path = jmespath.search("people[:2].first", dic_1)
print(path)
#运行结果
D:\Daily\whatisyeild>python jmespath_demo.py
['James', 'Jacob']
2. 更复杂点的数据返回
比如,在字典的值里再嵌套列表,依然可以被投影到通配符创建的列表里。
import jmespath
dic_1 = {
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"first": [["a","b","c"],2,3,4,5], "last": "g"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
path = jmespath.search("people[*].first[0]", dic_1)
print(path)
#运行结果
D:\Daily\whatisyeild>python jmespath_demo.py
[['a', 'b', 'c']]
3. 无效情况
需要注意的是,当通配符右边查找的元素是null的时候,投影到结果列表里这个元素是会被忽略的。
比如,people[*].first[0][10]下标越界了,所以最后输出的结果就是个空列表[]。
import jmespath
dic_1 = {
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"first": [["a","b","c"],2,3,4,5], "last": "g"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
path = jmespath.search("people[*].first[0][10]", dic_1)
print(path)
#运行结果:
D:\Daily\whatisyeild>python jmespath_demo.py
[]
另外,列表投影仅对list列表有效。如果值不是列表,则表达式的结果为null。
比如,用列表投影取foo[*]就不行了,因为 "foo": {"bar": "baz"} 对应的是一个json对象,所以会得到一个null。
import jmespath
dic_1 = {
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"first": [["a","b","c"],2,3,4,5], "last": "g"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
path = jmespath.search("foo[*]", dic_1)
print(path)
#运行结果
D:\Daily\whatisyeild>python jmespath_demo.py
None
【jmespath】—2. 进阶 List and Slice Projections的更多相关文章
- Python格式化处理json数据的方式
1.问题 在遇到json数据的过程中,我们经常需要获取json数据中某个值的操作,如果是用get方法去取比较繁琐,接下来介绍两种方式来取值. 2.jsonpath来格式化处理json数据 2.1介绍 ...
- 【jmespath】—4. 进阶 Flatten Projections
这里要怎么翻呢?扁平投影? 一.Flatten Projections 1. 核心1 这个可以暂时忽略,一个重要的核心是:对于列表/对象投影,在投影中创建投影时,原始文档的结构将保留. 说人话就是,比 ...
- 【jmespath】—3. 进阶 Object Projections
继续,来看Object Projections. 一.Object Projections 上面说的是列表投影,只适用于列表.那么对于json对象,可以用对象投影. 投影最终返回的仍然是个列表,只不过 ...
- js基础进阶--关于Array.prototype.slice.call(arguments) 的思考
欢迎访问我的个人博客:http://www.xiaolongwu.cn Array.prototype.slice.call(arguments)的作用为:强制转化arguments为数组格式,一般出 ...
- jmespath(2)投影Projections
投影 投影是JMESPath的关键特性之一.它允许您将表达式应用于元素集合.有五种投影: 列表投影 切片投影 对象投影 展平投影 过滤投影 处理投影需要注意的点 投影评估分为两个步骤.左侧(LHS)创 ...
- python之路——面向对象(进阶篇)
面向对象进阶:类成员.类成员的修饰符.类的特殊成员 类成员 类成员分为三大类:字段.方法.属性 一.字段 静态字段 (属于类) 普通字段(属于对象) class City: # 静态字段 countr ...
- #笔记#JavaScript进阶篇一
#JavaScript进阶篇 http://www.imooc.com/learn/10 #认识DOM #window对象 浏览器窗口可视区域监测—— 在不同浏览器(PC)都实用的 JavaScrip ...
- 用JSON-server模拟REST API(三) 进阶使用
用JSON-server模拟REST API(三) 进阶使用 前面演示了如何安装并运行 json server , 和使用第三方库真实化模拟数据 , 下面将展开更多的配置项和数据操作. 目录: 配置项 ...
- 异步编程之Promise(3):拓展进阶
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
随机推荐
- Pytorch_第八篇_深度学习 (DeepLearning) 基础 [4]---欠拟合、过拟合与正则化
深度学习 (DeepLearning) 基础 [4]---欠拟合.过拟合与正则化 Introduce 在上一篇"深度学习 (DeepLearning) 基础 [3]---梯度下降法" ...
- Mixed Precision Training —— caffe-float16
简介 最近有了突如其来的想法,如何把caffe的变得更小更快.后来翻到Nvidia开发caffe-float16,同时也看到它的论文.看完大致了解一番后,就做一下记录. 该工作的目标是,减少网络的所需 ...
- C#LeetCode刷题之#345-反转字符串中的元音字母(Reverse Vowels of a String)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3935 访问. 编写一个函数,以字符串作为输入,反转该字符串中的元 ...
- 利用BeautifulSoup去除HTML指定标签和去除注释
去除指定标签 from bs4 import BeautifulSoup #去除属性ul [s.extract() for s in soup("ul")] # 去除属性svg [ ...
- vue.js中 v-for,v-on,v-model,结合应用案例---记事本
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Lombok使用指南
一.Lombok 简介 Lombok 是一款 Java 开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(POJO).在开发 ...
- day3 基本语句
代码缩进为一个tab键 就是四个空格 断点 在代码首行前空白处,双击 然后点右上角臭虫 然后点下面箭头朝下的 1.if 语句 if 判断条件: ...
- dotnet cli
前言 dotnet cli (Command-Line Interface) .net 源代码和二进制文件管理工具.需要安装 .NET Core SDK. 终端执行 dotnet --info 可以打 ...
- java如何简单的将一个三位正整数分解成三个数
public class Leet { public static void main(String[] args) { Scanner scanner = new Scanner(System.in ...
- linux下top命令详细介绍
linux下top命令详细介绍 top 命令是 Linux 下常用的系统资源占用查看及性能分析工具,能够实时显示系统中各个进程的资源(比如cpu.内存的使用)占用状况,top命令的执行结果是一个动态显 ...