在做接口自动化测试时,经常需要从接口响应返回体中提取指定数据进行断言校验。
今天给大家推荐一款json数据提取神器: jsonpath
jsonpath和常规的json有哪些区别呢?在Python中,json是用于处理JSON数据的内置模块,而jsonpath是用于从JSON数据中提取特定数据的查询语言和相关库。
它们的区别和适用场景:
json模块:
- json模块是Python的内置模块,用于解析和生成JSON格式的数据。
- 它提供了loads()和dumps()等方法,用于将JSON数据与Python数据结构之间进行转换。
而jsonpath
是一种用于从JSON对象中提取特定数据的查询语言,类似于XPath,但是针对JSON格式的数据而设计。
它提供了一种灵活的方式来定位和提取JSON对象中的数据,可以使用通配符、过滤器等功能进行精确的数据定位。
简单来说:json模块适用于处理JSON数据的基本操作,而jsonpath适用于需要精确定位和提取JSON数据的复杂场景。
jsonpath用法
从上述可知,jsonpath是一种用于从JSON对象中提取特定数据的查询语言,类似于XPath,可以更精确地定位JSON对象中的数据。
常用的jsonpath操作符和通配符额:
- $: 根对象
- @: 当前对象
- .: 子对象
- ..: 递归地查找子对象
- *: 通配符,匹配任何属性或数组元素
- []: 过滤器,用于指定属性或数组元素的条件
下面是一个使用jsonpath提取JSON对象数据的示例:
代码语言:javascript复制import json
from jsonpath_ng import parse
# JSON对象
json_obj = {
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
# 使用jsonpath提取数据
jsonpath_expr = parse("$.store.book[1].author")
result = [match.value for match in jsonpath_expr.find(json_obj)]
print(result) # 输出: ['Evelyn Waugh']
在上面的示例中,我们使用jsonpath_ng库解析了一个jsonpath表达式,并使用find()方法在JSON对象中查找匹配的数据。在这个例子中,我们使用$.store.book[1].author提取了第二本书的作者。
当在自动化测试中使用jsonpath时,可以通过jsonpath表达式来提取JSON响应中的特定数据,以便进行断言、验证和后续的处理。以下是一些常见的提取场景示例:
1、提取单个属性的值:
代码语言:javascript复制# 提取单个属性的值
jsonpath_expr = parse("$.store.book[0].title")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result[0] == "Sayings of the Century"
2、提取数组中的所有元素:
代码语言:javascript复制# 提取数组中的所有元素
jsonpath_expr = parse("$.store.book[*].author")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result == ["Nigel Rees", "Evelyn Waugh"]
3、提取满足条件的元素:
代码语言:javascript复制# 提取满足条件的元素
jsonpath_expr = parse("$.store.book[?(@.price < 10)].title")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result == ["Sayings of the Century"]
4、提取嵌套属性的值:
代码语言:javascript复制# 提取嵌套属性的值
jsonpath_expr = parse("$.store.bicycle.color")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result[0] == "red"
5、提取多个属性的值并进行组合:
代码语言:javascript复制# 提取多个属性的值并进行组合
jsonpath_expr = parse("$.store.book[0].['title', 'author']")
result = [match.value for match in jsonpath_expr.find(response.json())]
assert result[0] == {"title": "Sayings of the Century", "author": "Nigel Rees"}
在这些示例中,我们使用了jsonpath表达式从JSON响应中提取了不同的数据,包括单个属性的值、数组中的所有元素、满足条件的元素、嵌套属性的值以及多个属性的值并进行组合。这些提取场景可以帮助我们在自动化测试中对API的响应数据进行验证和处理。