在接口测试的场景编排中, 少不了与JSONPath打交道,经常需要获取json中的某个值,并保存成变量供后面的请求进行调用或断言。
# 示例 JSON
{
"store": {
"book": [
{
"category": "计算机",
"author": "卢西亚诺.拉马略",
"title": "流畅的Python(第2版)",
"price": 99.90
},
{
"category": "计算机",
"author": "朱雷",
"title": "Python工匠:案例、技巧与工程实践",
"price": 49.90
},
{
"category": "艺术",
"author": "宁思潇潇",
"title": "新摄影笔记",
"price": 99.00
},
{
"category": "心理",
"author": "周岭",
"title": "认知觉醒:开启自我改变的原动力",
"price": 59.80
}
]
}
}
# JSONPath 语法总结
| 语法 | 描述 | 示例 |
|---|---|---|
$ | 根节点 | $.store.book |
@ | 当前节点,通常用于过滤操作 | $.store.book[?(@.price < 50)] |
. | 选择子节点 | $.store.book[0].title |
[] | 选择数组元素,通过下标或条件选择 | $.store.book[0] |
[] 和 , | 选择多个数组元素 | $.store.book[0,2] |
[start:end:step] | 数组切片 | $.store.book[0:2] |
* | 通配符,选择所有元素 | $.store.book[*].title |
.. | 递归搜索所有子节点 | $.store..price |
?() | 过滤表达式 | $.store.book[?(@.price > 90)] |
# 常见的过滤表达式
以下表达式在Python的
jsonpath库下测试通过,还有些强大的语法需要jsonpath-ng或JMESPath库才支持,但不在此多做介绍。
| 过滤表达式 | 说明 | 示例 |
|---|---|---|
@.price < 50 | 选择价格小于 50 的书籍 | $.store.book[?(@.price < 50)] |
@.price < 50 && @.category == '计算机' | 选择价格小于 50 且类别为计算机的书籍 | $.store.book[?(@.price < 50 && @.category == '计算机')] |
@.author == '周岭' | 选择作者为周岭的书籍 | $.store.book[?(@.author == '周岭')] |
@.price >= 90 && @.price <= 100 | 选择价格在 90 到 100 之间的书籍 | $.store.book[?(@.price >= 90 && @.price <= 100)] |
@.category in ['艺术', '心理'] | 选择类别为艺术或心理的书籍 | $.store.book[?(@.category in ['艺术', '心理'])] |