JsonPath用法示例
- 操作符
| 符号 | 描述 | 
|---|---|
| $ | 查询的根节点对象,用于表示一个json数据,可以是数组或对象 | 
| @ | 过滤器(filter predicate)处理的当前节点对象 | 
| * | 获取所有节点 | 
| . | 获取子节点 | 
| .. | 递归搜索,筛选所有符合条件的节点 | 
| ?() | 过滤器表达式,筛选操作 | 
| [start:end] | 数组片段,区间为[start,end),不包含end | 
| [A]或[A,B] | 迭代器下标,表示一个或多个数组下标 | 
- 函数。可以在JsonPath表达式执行后进行调用,其输入值为表达式的结果。
| 名称 | 描述 | 
|---|---|
| min() | 获取数值类型数组的最小值 | 
| max() | 获取数值类型数组的最大值 | 
| length() | 获取数值类型数组的长度,例如$.data.length() | 
| ... | ... | 
- 过滤器。过滤器是用于过滤数组的逻辑表达式。
| 操作符 | 描述 | 
|---|---|
| == | 等于 | 
| != | 不等于 | 
| < | 小于 | 
| =~ | 判断是否符合正则表达式,例如[?(@.name =~ /foo.*?/i)] | 
| in | 所属符号,例如[?(@.type in ["小雨","中到大雨"])] | 
| nin | 排除符号 | 
| ... | .... | 
如响应体:
BODY
{
   "code" : 200,
   "msg" : "成功!",
   "data" : {
      "yesterday" : {
         "date" : "13日星期一",
         "high" : "高温 23℃",
         "fx" : "东北风",
         "low" : "低温 18℃",
         "fl" : "<![CDATA[3-4级]]>",
         "type" : "小雨"
      },
      "city" : "杭州",
      "aqi" : null,
      "forecast" : [
         {
            "date" : "14日星期二",
            "high" : "24",
            "fengli" : "<![CDATA[3-4级]]>",
            "low" : "18",
            "fengxiang" : "东北风",
            "type" : "多云"
         },
         {
            "date" : "15日星期三",
            "high" : "22",
            "fengli" : "<![CDATA[3-4级]]>",
            "low" : "19",
            "fengxiang" : "东北风",
            "type" : "中到大雨"
         },
         {
            "date" : "16日星期四",
            "high" : "25",
            "fengli" : "<![CDATA[<3级]]>",
            "low" : "19",
            "fengxiang" : "东北风",
            "type" : "多云"
         },
         {
            "date" : "17日星期五",
            "high" : "30",
            "fengli" : "<![CDATA[<3级]]>",
            "low" : "22",
            "fengxiang" : "无持续风向",
            "type" : "小雨"
         },
         {
            "date" : "18日星期六",
            "high" : "33",
            "fengli" : "<![CDATA[<3级]]>",
            "low" : "19,
            "fengxiang" : "无持续风向",
            "type" : "多云"
         }
      ],
      "ganmao" : "各项气象条件适宜,无明显降温过程,发生感冒机率较低。",
      "wendu" : "21"
   }
}
| 表达式 | 含义 | 获取值 | 
|---|---|---|
| $.data.forecast[0].position_name | 获取data.forecast[0]对象中position_name值。 | 滨江 | 
| $.data.forecast[*].aqi | 使用迭代器,获取data中forecast数组中所有aqi的值。 | [62,68] | 
| $..forecast[?(@.aqi >= 60)].primary_pollutant | 使用迭代器,获取forecast数组中所有的aqi值大于等于60的primary_pollutant值。 | ['null','null'] | 
| {$.data.forecast[*].aqi}[0] | 使用迭代器,获取data中forecast数组中aqi的第一个值。 | 62 | 
| $.data.forecast[?(@.level=="良")].pm25 | 获取data中forecast数组中level等于"良"对象,并获取该对象中pm25的值。 | [43] | 
| $.data.forecast[?((@.level=="良")&&(@.aqi==62))].pm10 | 获取data中forecast数组中level等于“良”与等于aqi等于63的所有对象,并获取该对象中pm10的值。 | [73] | 
| $.data.forecast[?(@.aqi>65)].position_name | 获取data中forecast数组中aqi大于65的所有对象,并获取该对象中position_name值。 | ["西溪"] | 
实际中的应用场景示例:
1、校验返回体中某一个字段是否包含某一个值或多个值或某些内容,校验包含多个值以&&符号连接。例如type值中是否包含“多云”。
表达式:$.data.forecast[*].type 获取值为:["多云","中到大雨","多云","小雨","多云"]
用法:校验类型:Json匹配 参数:$.data.forecast[*].type 值:多云
描述:此块逻辑平台做了兼容处理,若值列填写的值包含于表达式获取的数组列表中,则校验通过。
2、在用例中校验或场景中表达式过滤输出获取到的值中某一个,例如type值中第一个值。
表达式:$.data.forecast[*].type 获取值为:["多云","中到大雨","多云","小雨","多云"]
取获取值中第一个值“多云”:{$.data.forecast[*].type}[0],依次类推。
3、若校验的返回体中参数key中含有 . () *等关键字时(与平台校验逻辑中关键字冲突,导致校验不通过)可以使用以下方法:
{
   "data" : [
      {
         "count(*)" : 123,
         "left(send_address,2)":456
      }
   ]
}
表达式:$.["data"][0]["count(*)"] 获取值为:123
表达式:{$.["data"][0]}['left(send_address,2)'] 获取值为:456
4、若校验返回体中某一个数组中参数包含或不包含某一个参数时,例如校验不包含avgUv7D
[
 {
  "supplierId":523,
  "goodsId":55280465,
  "onlineStatus":1,
  "title":"多颜色商品-auto-20161121154939513",
  "importType":1,
 }
]
表达式:{$.[?(@.goodsId == 55280465)]}.containsKey('avgUv7D') 获取值为false
或
表达式:!{$.[?(@.goodsId == 55280465)]}.containsKey('avgUv7D') 获取值为true
或
表达式:$.[?(@.goodsId == 55280465)].[?(@.avgUv7D)] 获取值为[]
5、若校验返回体中数组长度,Jsonpath语法表达式获取到的为二维数组形式,则可以使用length()函数。
[
  [
    {
      "picUrl": "https://yanxuan.nosdn.127.net/54fe672080fa28052e5faa72fe780663.jpg",
      "expireTime": 0,
      "onlineTime": 0
    },
    {
      "picUrl": "https://yanxuan.nosdn.127.net/cb509d41739f8ce3764973e4888e06f3.jpg",
      "expireTime": 0,
      "onlineTime": 0
    }
  ]
]
6、若校验返回体中数组中某个参数值符合正则表达式,例如校验productName参数值中都包含lv字符串。
{
   "code" : 200,
   "message" : "成功",
   "result" : 
   {
      "list" : 
      [
         {
            "id" : 3002,
            "businessAccount" : "laotest6@163.com",
            "itemId" : "7777",
            "productName" : "LV"
        },
         {
            "id" : 3002,
            "businessAccount" : "laotest6@163.com",
            "itemId" : "7777",
            "productName" : "Velvet by Graham & Spencer"
        }
      ]
   }
}
表达式:{$.result.list[?(@.productName =~ /.*lv.*/i)].id}.size() 获取值为2
或
表达式:{$.result.list[?(!(@.productName =~ /.*lv.*/i))].id}.size() 获取值为0
7、若校验返回体中某一个参数值参数类型,例如校验he参数是否为string类型。
{
  "data": {
    "eh": null,
    "ad": 12345,
    "he": "快使用双节棍,哼哼哈嘿!!",
    "da": [
      "呜哇呜哇",
      "滴答滴答",
      "嗷呜嗷呜"
    ]
  }
}
表达式:{$.data}.getClass().getName() 获取值为java.util.LinkedHashMap
表达式:{$.data.he}.getClass().getName()  获取值为java.lang.String
或
表达式:{$.data.he}.getClass().getSampleName()  获取值为string
可以使用[http://jsonpath.herokuapp.com/来验证你的表达式哦~
未完待续~~~