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

五、链接地址

1、https://jmespath.org/tutorial.html

2、https://pypi.org/project/jmespath/

posted @ 2020-09-13 17:27  xyztank  阅读(750)  评论(0编辑  收藏  举报