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的更多相关文章

  1. Python格式化处理json数据的方式

    1.问题 在遇到json数据的过程中,我们经常需要获取json数据中某个值的操作,如果是用get方法去取比较繁琐,接下来介绍两种方式来取值. 2.jsonpath来格式化处理json数据 2.1介绍 ...

  2. 【jmespath】—4. 进阶 Flatten Projections

    这里要怎么翻呢?扁平投影? 一.Flatten Projections 1. 核心1 这个可以暂时忽略,一个重要的核心是:对于列表/对象投影,在投影中创建投影时,原始文档的结构将保留. 说人话就是,比 ...

  3. 【jmespath】—3. 进阶 Object Projections

    继续,来看Object Projections. 一.Object Projections 上面说的是列表投影,只适用于列表.那么对于json对象,可以用对象投影. 投影最终返回的仍然是个列表,只不过 ...

  4. js基础进阶--关于Array.prototype.slice.call(arguments) 的思考

    欢迎访问我的个人博客:http://www.xiaolongwu.cn Array.prototype.slice.call(arguments)的作用为:强制转化arguments为数组格式,一般出 ...

  5. jmespath(2)投影Projections

    投影 投影是JMESPath的关键特性之一.它允许您将表达式应用于元素集合.有五种投影: 列表投影 切片投影 对象投影 展平投影 过滤投影 处理投影需要注意的点 投影评估分为两个步骤.左侧(LHS)创 ...

  6. python之路——面向对象(进阶篇)

    面向对象进阶:类成员.类成员的修饰符.类的特殊成员 类成员 类成员分为三大类:字段.方法.属性 一.字段 静态字段 (属于类) 普通字段(属于对象) class City: # 静态字段 countr ...

  7. #笔记#JavaScript进阶篇一

    #JavaScript进阶篇 http://www.imooc.com/learn/10 #认识DOM #window对象 浏览器窗口可视区域监测—— 在不同浏览器(PC)都实用的 JavaScrip ...

  8. 用JSON-server模拟REST API(三) 进阶使用

    用JSON-server模拟REST API(三) 进阶使用 前面演示了如何安装并运行 json server , 和使用第三方库真实化模拟数据 , 下面将展开更多的配置项和数据操作. 目录: 配置项 ...

  9. 异步编程之Promise(3):拓展进阶

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

随机推荐

  1. spring的IOC(反转控制)

    Spring概念 1.1.1 spring 是什么 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制 ...

  2. 实验04——java保留小数的两种方法、字符串转数值

    package cn.tedu.demo; import java.text.DecimalFormat; /** * @author 赵瑞鑫 E-mail:1922250303@qq.com * @ ...

  3. python IF while逻辑判断语句

    if判断语句 if 1==1 and 2==2: pass else: print('error') if 1==1 or 2==2: pass else: print('error') while循 ...

  4. 树状图展示终端目录内容-tree

    以树状图列出目录的内容,让你一目了然 执行 tree 指令,它会列出指定目录下的所有文件,包括子目录里的文件. 安装 我们通过包管理工具可以方便的安装它 mac - brew install tree ...

  5. 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!

    最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封 ...

  6. GitLab 查看版本号

    cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

  7. 一个试图了解JVM内存模型的两年经验的初级程序员,透彻!

    所有的编程语言中都有内存模型这个概念,区别于微架构的内存模型,高级语言的内存模型包括了编译器和微架构两部分.我试图了解了Java.C#和Go语言的内存模型,发现内容基本大同小异,只是这些语言在具体实现 ...

  8. java引用数据类型之Scanner与Random

    一 Scanner类 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型  变量名  =  new 数据类型(); 每种引用数据类型都s ...

  9. C#LeetCode刷题之#35-搜索插入位置(Search Insert Position)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3979 访问. 给定一个排序数组和一个目标值,在数组中找到目标值, ...

  10. Android 使用AS编译出错:Error: Duplicate resources

    原因在于drawable目录下有重复的文件名!!! 修改其中的一个文件名或者删除其中一张图(或者xml文件)就可以啦~