- 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!
注册 关于