- jsonpath介绍
用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。
使用方法如:
import jsonpath
res=jsonpath.jsonpath(dic_name,'$..key_name')
#嵌套n层也能取到所有key_name信息,其中:“$”表示最外层的{},“..”表示模糊匹配,当传入不存在的key_name时,程序会返回false
-
JsonPath 对于 JSON 来说,相当于 XPath 对于 XML。
安装方法:pip install jsonpath
官方文档:http://goessner.net/articles/JsonPath
- JsonPath与XPath语法对比:
Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。
- JsonPath与XPath语法对比:
Xpath | JSONPath | 描述 |
---|---|---|
/ | $ | 根节点 |
. | @ | 现行节点 |
/ | . or [] | 取子节点 |
.. | n/a | 就是不管位置,选择所有符合条件的条件 |
* | * | 匹配所有元素节点 |
[] | [] | 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等) |
| | [,] | 支持迭代器中做多选 |
[] | ?() | 支持过滤操作 |
n/a | () | 支持表达式计算 |
() | n/a | 分组,JsonPath不支持 |
- 使用实例:返回结果是list(列表)格式
from jsonpath import jsonpath
dict ={
"lemon": {
"teachers": [
{
"id": "101",
"name": "华华",
"addr": "湖南长沙",
"age": 25
},
{
"id": "102",
"name": "韬哥",
"age": 28
},
{
"id": "103",
"name": "Happy",
# "addr": "广东深圳",
"age": 16
},
{
"id": "104",
"name": "歪歪",
"addr": "广东广州",
"age": 29
}
],
"salesmans": [
{
"id": "105",
"name": "毛毛",
"age": 17
},
{
"id": "106",
"name": "大树",
"age": 27
}
]
},
"avg": 25
}
# 获取所有老师的的名称,返回结果为列表,列表值为字典
# teachers = jsonpath(dict,"$.lemon.teachers[*].name")
teachers = jsonpath(dict,"$..teachers[*].name")
print(f"获取所有老师的的名称{teachers}")
# 获取所有人的名称
names = jsonpath(dict,"$..name")
print(f"获取所有人的名称{names}")
# 所有的老师和销售
# man = jsonpath(dict,"$.[*]")
man = jsonpath(dict,"$.lemon.*")
print(f"所有的老师和销售{man}")
# 所有人的年龄
# ages = jsonpath(dict,"$..age")
ages = jsonpath(dict,"$.lemon..age")
print(f"所有人的年龄{ages}")
# 所有老师的年龄
tea_ages = jsonpath(dict,"$..teachers[*].age")
print(f"所有老师的年龄{tea_ages}")
# 索引为 3(第 4 个)老师的信息
tea3 = jsonpath(dict,"$..teachers[3]")
print(f"索引为 3(第 4 个)老师的信息{tea3}")
# 倒数第 2 个老师的信息----有问题
tea2 = jsonpath(dict,"$..teachers[-2]")
print(f"倒数第 2 个老师的信息{tea2}")
# 索引 0(包含)到索引 2(不包含)的老师信息
tea = jsonpath(dict,"$..teachers[0:2]")
print(f"索引 0(包含)到索引 2(不包含)的老师信息{tea}")
# 所有包含地址的老师信息(jsonpath_rw 不支持)
has_add = jsonpath(dict,"$..teachers[?(@.addr)]")
# has_add = jsonpath(dict,"$..teachers[?(@.addr)]")
print(f"所有包含地址的老师信息(jsonpath_rw 不支持){has_add}")
欢迎来到testingpai.com!
注册 关于