JSONPath和XPath使用
备注
在提取变量或者设置断言中很多地方会涉及使用JSONPath
、XPath
来获取内容,本文重点介绍他们的使用方法技巧
一、JSONPath 使用指南
基本语法
$
- 根节点.
- 子节点操作符[]
- 子节点访问/过滤*
- 通配符..
- 递归下降
// 示例数据
{
"store": {
"book": [
{"title": "JSONPath Guide", "price": 8.95},
{"title": "XPath Master", "price": 12.99},
{"title": "Regex Pro", "price": 9.99, "category": "tech"}
],
"location": "New York"
}
}
常用表达式
// 获取所有书籍
$.store.book[*]
// 获取第一本书的标题
$.store.book[0].title
// 获取价格低于10的书籍
$.store.book[?(@.price < 10)]
// 递归查找所有价格属性
$..price
// 获取包含category属性的书籍
$.store.book[?(@.category)]
特殊场景处理
1. 处理特殊字符键名,包含中文
{
"user@domain": "example",
"special.key": "value",
"参数名": "value",
}
$['user@domain'] // 正确
$['special.key'] // 正确
$['参数名'] // 正确
2. 空值处理
// 使用 || 提供默认值
$.store.book[0].author || "Unknown"
3. 复杂过滤
// 多条件过滤
$.store.book[?(@.price > 8 && @.price < 10)]
4. 函数扩展
// 长度计算(某些实现)
$.store.book.length()
二、XPath 使用指南
基本语法
/
- 根节点//
- 任意位置.
- 当前节点..
- 父节点@
- 属性选择
<!-- 示例数据 -->
<bookstore>
<book category="tech">
<title lang="en">XPath Master</title>
<price>29.99</price>
</book>
<book category="cooking">
<title lang="fr">Cooking Guide</title>
<price>19.99</price>
</book>
</bookstore>
常用表达式
// 选择所有book节点
//book
// 选择第一个book的title
/bookstore/book[1]/title
// 选择第一个book的title的文字内容
/bookstore/book[1]/title/text()
// 选择价格大于20的书籍
/book[price > 20]
// 选择lang属性为en的title
//title[@lang='en']
// 选择父节点的category属性
//price/../@category
特殊场景处理
1. 命名空间处理
<ns:book xmlns:ns="http://example.com">
<ns:title>XML Guide</ns:title>
</ns:book>
// 声明命名空间前缀
//*[local-name()='title']
2. 文本包含搜索
// 包含"Guide"的标题
//title[contains(text(), 'Guide')]
3. 位置选择
// 选择最后一个book
//book[last()]
// 选择前两个book
//book[position() <= 2]
4. 多条件查询
// 类别为tech且价格>25的书籍
//book[@category='tech' and price>25]
四、检测工具
1. 测试工具
- JSONPath:
- XPath:
2. 常见陷阱
- JSONPath: json的key中包含特殊字符和中文
- XPath: 索引从1开始