一、多层嵌套响应断言
1.1 简介
-
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。
-
在实际应用中,JSON通常用于接口响应,且可以包含多层嵌套结构。
-
这种嵌套结构使得JSON能够表示复杂的嵌套数据结构,包括对象嵌套对象、数组嵌套对象、对象嵌套数组等。
1.2 多层嵌套结构示例
// - 层级多。
// - 嵌套关系复杂。
{
"errcode": 0,
"errmsg": "ok",
"userid": "zhangsan",
"name": "张三",
"department": [1, 2],
"order": [1, 2],
"position": "后台工程师",
"mobile": "13800000000",
"gender": "1",
"email": "zhangsan@gzdev.com",
"biz_mail": "zhangsan@qyycs2.wecom.work",
"is_leader_in_dept": [1, 0],
"direct_leader": ["lisi", "wangwu"],
"avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0",
"thumb_avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/100",
"telephone": "020-123456",
"alias": "jackzhang",
"address": "广州市海珠区新港中路",
"open_userid": "xxxxxx",
"main_department": 1,
"extattr": {
"attrs": [
{
"type": 0,
"name": "文本名称",
"text": {
"value": "文本"
}
},
{
"type": 1,
"name": "网页名称",
"web": {
"url": "http://www.test.com",
"title": "标题"
}
}
]
},
"status": 1,
"qr_code": "https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx",
"external_position": "产品经理",
"external_profile": {
"external_corp_name": "企业简称",
"wechat_channels": {
"nickname": "视频号名称",
"status": 1
},
"external_attr": [
{
"type": 0,
"name": "文本名称",
"text": {
"value": "文本"
}
},
{
"type": 1,
"name": "网页名称",
"web": {
"url": "http://www.test.com",
"title": "标题"
}
},
{
"type": 2,
"name": "测试app",
"miniprogram": {
"appid": "wx8bd80126147dFAKE",
"pagepath": "/index",
"title": "my miniprogram"
}
}
]
}
}
1.3 使用场景
-
多层嵌套响应断言(Assertions for Nested JSON Responses)是指在处理和验证API响应时,对JSON数据结构中包含的多层嵌套属性进行断言和验证的过程。
-
多层嵌套的JSON响应,通常包含嵌套的对象、数组和其他数据类型,需要确保每一层的数据都符合预期。
场景 | 方式 |
---|---|
提取errcode对应的值 | res["errcode"] |
提取title对应的值 | res["extattr"]["external_profile"]["external_attr"][1]["web"]["title"] |
提取type为0的name | 编码实现 |
提取attrs下的所有的name | 编码实现 |
- 使用字典处理多层嵌套的JSON结构有一些缺点,特别是在编写、维护和操作复杂数据时。
-
当嵌套层级较深时,访问某个具体值,需要写一长串键的路径,这使代码难以阅读和维护。
-
深层嵌套的字典路径容易出错,如果键名拼写错误或层级结构有变动,可能导致代码崩溃,或产生错误结果。
-
二、使用JSONPath进行多层嵌套响应断言
2.1 JSONPath简介
-
在JSON数据中定位和提取特定信息的查询语言;
-
JSONPath使用类似于Xpath的语法,使用路径表达式,从JSON数据中选择和提取数据;
-
相比于传统的提取方式,更加灵活且支持定制化。
2.2 JSONPath语法
符号 | 描述 |
---|---|
$ | 查询的根节点对象,用于表示一个 json 数据,可以是数组或对象 |
@ | 过滤器(filter predicate)处理的当前节点对象 |
* | 通配符 |
. | 获取子节点 |
… | 递归搜索,筛选所有符合条件的节点 |
?() | 过滤器表达式,筛选操作 |
[start:end] | 数组片段,区间为[start,end),不包含 end |
[A]或[A,B] | 迭代器下标,表示一个或多个数组下标 |
2.3 JSONPath练习环境
{
"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
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
- 语法示例:
要求 | JsonPath |
---|---|
所有书籍的作者 | $.store.book[*].author |
所有作者 | $…author |
store 下面的所有内容 | $.store.* |
所有的价格 | $.store…price |
第三本书 | $…book[2] |
所有包含 isbn 的书籍 | $…book[?(@.isbn)] |
所有价格小于 10 的书 | $.store.book[?(@.price < 10)] |
所有书籍的数量 | $…book.length |
2.2 结合Python使用JSONPath
-
安装环境:
pip install jsonpath
-
使用方法:
jsonpath.jsonpath(源数据对象, jsonpath表达式)