jsonpath是使用一种简单的方法提取给定的json文档的部分内容,我们做接口测试时,目前主要流行的数据结构是json,遇到复杂的json格式,使用jsonpath提取数据
我们在使用jsonpath的时候首先需要去安装jsonpath
pip install jsonpath
JSONPath语法和XPATH语法对比 JSON结构清晰,可读性高,复杂度低,非常容易匹配。JSONPath的语法与Xpath类似,如下表所示为JSONPath与XPath语法对比。
XPATH | JSON | |
/ | $ | 表示根元素 |
. | @ | 当前元素 |
/ | .or[] | 子元素 |
.. | n/a | 父元素 |
// | .. | 递归下降,JSONPATH从EX4借鉴 |
* | * | 通配符表示所有元素 |
@ | n/a | 属性访问字符 |
[] | [] | 子元素访问字符 |
| | [,] | 连接操作符在Xpath结果结合并与其他节点集合,JSON允许name或者数组索引 |
n/a | [start:end:step] | 数组分隔符从ES4借鉴 |
[] | ?() | 应用过滤表达式 |
n/a | () | 脚本表达式,使用在脚本下面 |
() | n/a | Xpath分组 |
利用JSON文档演示JSONPATH的作用:
JSON文件内容如下:
{"store": {
"book": [
{"category": "玄幻",
"author": "唐家三少",
"title": "斗罗大陆",
"price": 8.95
},
{"category": "历史",
"author": "愤怒的香蕉",
"title": "赘婿",
"price": 12.99
},
{"category": "玄幻",
"author": "爱潜水的乌贼",
"title": "诡秘之主",
"isbn": "0-553-21311-3",
"price": 8.99
},
{"category": "仙侠",
"author": "祭酒",
"title": "地煞七十二变",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"author": "大司马",
"color": "red",
"price": 19.95
}
}
}
查询前的准备:
#导入包
import jsonpath
import json
#对json文件进行反序列化
obj = json.load(open('073_尚硅谷_爬虫_解析_jsonpath.json','r',encoding='utf-8'))
1:查询所有书店的作者
#书店所有书的作者
author_list = jsonpath.jsonpath(obj,'$.store.book[*].author')
print(author_list)
2:所有的作者(由于文件中有多个指标,所以我们可以查询多指标里面的信息)
author_list= jsonpath.jsonpath(obj,'$..author')
print(author_list)
3:store下面的所有元素
tag_list =jsonpath.jsonpath(obj,'$.store.*')
print(tag_list)
4:store里面所有的price
price_list =jsonpath.jsonpath(obj,'$.store..price')
print(price_list)
5:第三本书
book = jsonpath.jsonpath(obj,'$..book[2]')
print(book)
6:最后一本书
book = jsonpath.jsonpath(obj,'$..book[(@.length-1)]')
print(book)
7:前两本书
#book_list = jsonpath.jsonpath(obj,'$..book[0,1]')
book_list = jsonpath.jsonpath(obj,'$..book[:2]')
print(book_list)
8:过滤出所有含isbn的书
#条件过滤需要在()前加一个?
book_list = jsonpath.jsonpath(obj,'$..book[?(@.isbn)]')
print(book_list)
9:那本书超过了10块钱
book_list = jsonpath.jsonpath(obj,'$..book[?(@.price>10)]')
print(book_list)