Jmespath提取json元素之基本操作
一、基本表达式
Jmespath是一种用于 JSON 的查询语言,您可以从 JSON 文档中提取和转换元素。安装方式如下:
pip install jmespath
基本表达式:
jmespath.search(解析式, 数据)
示例:获取book的名字
import jmespath
data = {"book": "西游记", "price": "40", "出版社": "中信出版社"}
parse_data = jmespath.search("book", data)
print(f"解析后的数据为:{parse_data}")
结果:
解析后的数据为:西游记
若获取的key不存在那么将返回None,如下:
import jmespath
data = {"book": "西游记", "price": "40", "出版社": "中信出版社"}
parse_data = jmespath.search("name", data)
print(f"解析后的数据为:{parse_data}")
结果:
解析后的数据为:None
二、提取JSON 对象中的嵌套值
这里返回的json格式是多重嵌套形。
import jmespath
data = {"a": {"b": {"c": {"d": "value"}}}}
parse_data = jmespath.search("a.b.c.d", data) #获取其值的基本表达式为:key.key.key
print(f"解析后的数据为:{parse_data}")
结果:
解析后的数据为:value
三、获取列表元素
这里返回的数据是列表,同样,jmespath也可以对其进行解析并提取。如下:
1、获取列表全部元素
import jmespath
data = ["a", "b", "c", "d", "e", "f"]
parse_data1 = jmespath.search("[*]", data) # 获取列表全部元素
parse_data2 = jmespath.search("[]", data) # 获取列表全部元素
parse_data3 = jmespath.search("[1]", data) # 获取列表第二个元素
print(f"解析后的数据为:{parse_data1}")
print(f"解析后的数据为:{parse_data2}")
print(f"解析后的数据为:{parse_data3}")
结果:
解析后的数据为:['a', 'b', 'c', 'd', 'e', 'f']
解析后的数据为:['a', 'b', 'c', 'd', 'e', 'f']
解析后的数据为:b
如果指定的索引大于列表,则返回 null 值。您还可以使用负索引来从列表末尾索引。[-1]引用列表中的最后一个元素,[-2]引用倒数第二个元素。
2、组合标识符、子表达式和索引表达式来提取JSON 元素
import jmespath
data = {"a": {
"b": {
"c": [
{"d": [0, [1, 2]]},
{"d": [3, 4]}
]
}
}}
parse_data = jmespath.search("a.b.c[]", data) # 获取c的全部元素
parse_data1 = jmespath.search("a.b.c[0]", data) # 获取c的第一元素
parse_data2 = jmespath.search("a.b.c[0].d[1]", data) # 获取c中d的第二元素
print(f"解析后的数据为:{parse_data}")
print(f"解析后的数据为:{parse_data1}")
print(f"解析后的数据为:{parse_data2}")
结果:
解析后的数据为:[{'d': [0, [1, 2]]}, {'d': [3, 4]}]
解析后的数据为:{'d': [0, [1, 2]]}
解析后的数据为:[1, 2]
三、列表切片操作
这里返回的数据是列表,同样,jmespath也可以对其进行切片操作,这和Python中list的切片操作一致。如下:首先,给定一个从0到9的整数数组
import jmespath
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
parse_data = jmespath.search("[0:5]", data) # 选择数组的前半部分
parse_data1 = jmespath.search("[:5]", data) # 选择数组的前半部分
parse_data2 = jmespath.search("[::2]", data) # 隔2位选择
parse_data3 = jmespath.search("[::-1]", data) # 相反顺序创建切片
print(f"解析后的数据为:{parse_data}")
print(f"解析后的数据为:{parse_data1}")
print(f"解析后的数据为:{parse_data2}")
print(f"解析后的数据为:{parse_data3}")
结果:
解析后的数据为:[0, 1, 2, 3, 4]
解析后的数据为:[0, 1, 2, 3, 4]
解析后的数据为:[0, 2, 4, 6, 8]
解析后的数据为:[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
四、列表和切片投影
通配符表达式创建一个列表投影,它是 JSON 数组上的一个投影。
1、非标准的字典格式
data不是一个标准的字典格式,其中包含列表
import jmespath
#这里data不是一个标准的字典格式,其中包含列表。
data = {
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
parse_data = jmespath.search("people[*].first", data) # 提取people下所有元素的第一个元素
parse_data1 = jmespath.search("people[].first", data) # 提取people下所有元素的第一个元素
parse_data2 = jmespath.search("people[*].last", data) # 提取people下所有元素的第二个元素
parse_data3 = jmespath.search("people[:2].last", data) # 提取people下前两个元素的第二个元素
print(f"解析后的数据为:{parse_data}")
print(f"解析后的数据为:{parse_data1}")
print(f"解析后的数据为:{parse_data2}")
print(f"解析后的数据为:{parse_data3}")
结果:
解析后的数据为:['James', 'Jacob', 'Jayden']
解析后的数据为:['James', 'Jacob', 'Jayden']
解析后的数据为:['d', 'e', 'f']
解析后的数据为:['d', 'e']
2、标准的字典格式
import jmespath
#data是一个标准的字典格式
data = {
"ops": {
"functionA": {"numArgs": 2},
"functionB": {"numArgs": 3},
"functionC": {"variadic": True}
}
}
parse_data = jmespath.search("ops.*.numArgs", data) # 提取ops下所有含numArgs属性的元素值
parse_data1 = jmespath.search("ops.*.variadic", data) # 提取ops下所有含variadic属性的元素值
parse_data2 = jmespath.search("ops.functionA.numArgs", data) # 提取ops下functionA中numArgs属性的元素值
print(f"解析后的数据为:{parse_data}")
print(f"解析后的数据为:{parse_data1}")
print(f"解析后的数据为:{parse_data2}")
结果:
解析后的数据为:[2, 3]
解析后的数据为:[True]
解析后的数据为:2