[toc]
# JSONPath Match Assertion
JSONPath 匹配断言使用 JSONPath 表达式从目标属性中选择内容,并将结果与期望值比较。如果它们匹配,断言通过,否则断言失败。
>[warning]本断言仅适用于包含 JSON 数据的请求和响应。
要了解更多关于 JSONPath 语法的知识,请参阅 [JSONPath](JSONPath.md) 。
## 适用场景
您可以在 ReadyAPI 套件的不同应用程序中使用这个断言。根据应用程序的不同,断言验证以下数据:
| 应用 | 检查数据 | 更多信息 |
| --- | --- | --- |
| [SoapUI](SoapUI.md) | request 和 response body | [SoapUI 断言](断言.md) |
| [Secure](Secure.md) | response body | [Secure 断言](Secure断言.md) |
| [ServiceV](ServiceV.md) | request body | [ServiceV 断言](ServiceV断言.md) |
## 创建断言
1、在对话框的左边,选择 **Property Content** 类别。
2、在对话框的右边,选择 **JSONPath Match** 。
3、点击 **Add** 。
**SoapUI**
![](https://support.smartbear.com/readyapi/docs/_images/testing/assertions/reference/create-soap.png)
**Secure**
![](https://support.smartbear.com/readyapi/docs/_images/testing/assertions/reference/create-secure.png)
**ServiceV**
![](https://support.smartbear.com/readyapi/docs/_images/testing/assertions/reference/create-servicev.png)
## 设置断言
1、在 **JSONPath Expression** 编辑框,输入 JSONPath 表达式(指向要比较的元素),或者使用工具栏按钮 <img class="aqInlineImg" src="https://support.smartbear.com/readyapi/docs/_images/icon/node.png" > 自动生成表达式。
>[warning]1、要使用工具栏按钮,请至少运行一次 request(用于断言的 request )。
2、**JSONPath Expression** 编辑框,不支持使用属性扩展,如:`${REST Request#Response#$['data']['token']}` 。
![](https://support.smartbear.com/readyapi/docs/_images/testing/assertions/reference/property/json-match.png)
自动生成表达式的工具栏按钮:
| 按钮 | 描述 |
| --- | --- |
| <img class="aqInlineImg" src="https://support.smartbear.com/readyapi/docs/_images/icon/node.png" > | 调用一个对话框,从最近的一次请求或响应中选择一个节点,并为该节点创建一个 JSONPath 表达式。 |
2、在 **Expected Result** 编辑框,输入预期值。
如果要从存在的请求或响应中可视化地选择预期结果,使用下面这些选项:
| 选项 | 描述 |
| --- | --- |
| Select Content | 可视化地生成一个 [属性扩展](属性扩展.md) ,并赋值到预期结果编辑框。 |
| Select from Current | 从最近一次响应中自动获取一个值(或者 ServiceV 虚拟服务所收到的最近一次请求) |
3、使用额外的选项来增强预期结果:
| 选项 | 描述 |
| --- | --- |
| Allow Wildcards | 对值的不同部分使用星号通配符(\*)。<br> **提示:** 如果未选中该选项,那么当实际值是动态值时,断言将失败。 |
4、点击 **Test** 按钮,测试断言(实际值的来源为最近一次响应或 ServiceV 虚拟服务中的最近一次请求)。
## 语法提示
1、不要对元素名称和值使用双引号,使用单引号。
2、根据表达式语法的不同,JSONPath 表达式可以返回单个值或数组。
(1)包含过滤器 `[?(filter)]` 和数组片段 `[start:end]` 的表达式总是返回数组,即使结果数组中只包含一个项。例如:
~~~
{
"code" : "200",
"message" : "OK",
"data" : {
"templetList" : [
{
"tid" : "3",
"name" : "K001",
"type" : 0,
"tips" : "animal"
},
{
"tid" : "5",
"name" : "K002",
"type" : 1,
"tips" : "food"
}
]
}
}
~~~
~~~
$.data.templetList[?(@.tid=='5')].tips // 返回:[food]
~~~
将返回一个数组,即使 `tips` 元素仅有一个值。要获取该值,在表达式中添加索引(下标):
~~~
$.data.templetList[?(@.tid=='5')].tips[0] // 返回:food
~~~
(2)当对象有两个或更多的属性时,对象通配符将返回一个数组。否则,将返回单个属性的值(这个值将保留原来的类型)。例如,假设需要从下列对象的获取属性:
~~~
{
"section": {
"first_subsection": {
"name": "titular"
},
"second_subsection": {
"name": "secondary",
"contains_images": true
}
}
}
~~~
下面的表达式返回 `titular` 字符串:
~~~
$.section.first_subsection.*
// first_subsection 元素只有一个属性
~~~
下面的表达式返回一个数组:
~~~
$.section.second_subsection.*
// 返回 ["name": "secondary", "contains_images": true"]
~~~
(3)数组通配符( `arr[*]` ) 的行为取决于你使用的 ReadyAPI 版本。
**在 ReadyAPI 2.3.0 中**
数组通配符总是返回一个数组。在前面的例子中,下面的表达式:
~~~
$.section.first_subsection[*]
~~~
将返回一个数组:
~~~
["titular"]
~~~
**在 ReadyAPI 1.9.0 – 2.2.0 中**
略
## 示例
1、检查 `widget` 元素中的 `text` 子元素:
~~~
$.widget.text
~~~
2、检查 `widget` 元素下的所有子元素:
~~~
$.widget.*
~~~
3、检查 `data` 元素下 `templetList` 数组中 `tid` 子元素值为 5 的数组项(这里为数组的第二项)的 `reward` 元素:
~~~
{
"code" : "200",
"message" : "OK",
"data" : {
"templetList" : [
{
"tid" : "3",
"name" : "KQJX001",
"type" : 0,
"reward" : 10.00
},
{
"tid" : "5",
"name" : "KQJX002",
"type" : 1,
"reward" : 15.00
}
]
}
}
~~~
~~~
$.data.templetList[?(@.tid=='5')].reward
~~~
---
**参考资料**
1、[ReadyAPI Documentation / Testing APIs / Verifying Results / Assertion Reference / Property Content Assertions / JSONPath Match Assertion](https://support.smartbear.com/readyapi/docs/testing/assertions/reference/property/json-match.html)
---
:-: --- 贡献者名单(排名不分先后) ---
:-: **材料**
:-: **编写**
李云
:-: **校验**
:-: **支持**
- 基础知识
- 属性
- 属性分类
- 属性扩展
- Get Data 对话框
- 断言
- 关于断言
- 使用断言
- 断言类型
- Response SLA
- Script
- Property Content Assertions
- Contains
- Equals
- Equals Binary
- JSONPath Count
- JSONPath Existence Match
- JSONPath Match
- JSONPath RegEx Match
- Message Content
- Not Contains
- XPath Match
- XQuery Match
- Compliance Assertions
- Swagger Compliance
- Schema Compliance
- HTTP Header Exists
- HTTP Header Equals
- JDBC Assertions
- 复制断言
- 术语
- 脚本
- 关于脚本
- 脚本编辑器
- JSONPath
- Projects
- SoapUI
- 测试步骤
- Groovy Script
- DataSource
- Conditional GoTo
- REST Request
- ReadyAPI
- 环境
- 关于环境
- 创建环境
- Rest Services
- Custom Properties
- JDBC Connections
- 团队协作
- 集成
- GitLab
- 第三方库
- Groovy 库
- Java 库
- 自定义ReadyAPI
- 首选项
- 全局属性
- ReadyAPI
- Code Templates
- JVM 设置
- 修改
- 实战指导
- 项目属性
- Groovy
- 代码片段
- 开发规范 v0.1
- 属性
- inbox
- FAQ
- 安装配置
- 复合工程
- 修改文件夹或文件名称