跳到主要内容

JSONPath和XPath使用

备注

在提取变量或者设置断言中很多地方会涉及使用JSONPathXPath来获取内容,本文重点介绍他们的使用方法技巧

一、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:

image.png

image.png

  • XPath:

image.png

image.png

2. 常见陷阱

  • JSONPath: json的key中包含特殊字符和中文
  • XPath: 索引从1开始