接口-多层嵌套响应断言

一、多层嵌套响应断言

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表达式)