文章目录
- 
- [一. jsonpath语法](#一. jsonpath语法)
- 
- [1. 操作符](#1. 操作符)
- [2. 函数](#2. 函数)
- [3. 过滤器](#3. 过滤器)
 
- 二.实例说明
- 
- [1. 常用示例](#1. 常用示例)
- [2. 实际中的应用场景示例](#2. 实际中的应用场景示例)
 
 
参考:https://gotest.hz.netease.com/doc/jie-kou-ce-shi/xin-zeng-yong-li/can-shu-xiao-yan/jsonpi-pei/jsonpathyu-fa.html
一. jsonpath语法
1. 操作符
| 符号 | 描述 | 
| $ | 查询的根节点对象,用于表示一个json数据,可以是数组或对象 | 
| @ | 过滤器(filter predicate)处理的当前节点对象 | 
| * | 获取所有节点 | 
| . | 获取子节点 | 
| ... | 递归搜索,筛选所有符合条件的节点 | 
| ?() | 过滤器表达式,筛选操作 | 
| [start:end] | 数组片段,区间为[start,end),不包含end | 
| [A]或[A,B] | 迭代器下标,表示一个或多个数组下标 | 
2. 函数
可以在JsonPath表达式执行后进行调用,其输入值为表达式的结果。
| 名称 | 描述 | 
| min() | 获取数值类型数组的最小值 | 
| max() | 获取数值类型数组的最大值 | 
| length() | 获取数值类型数组的长度,例如$.data.length() | 
| ... | ... | 
3. 过滤器
过滤器是用于过滤数组的逻辑表达式。
| 操作符 | 描述 | 
| == | 等于 | 
| != | 不等于 | 
| < | 小于 | 
| =~ | 判断是否符合正则表达式,例如[?(@.name =~ /foo.*?/i)] | 
| in | 所属符号,例如[?(@.type in ["小雨","中到大雨"])] | 
| nin | 排除符号 | 
| ... | ... | 
二.实例说明
1. 常用示例
        
          
            
            
              json
              复制代码
              
            
          
          BODY
{
   "code" : 200,
   "msg" : "成功!",
   "data" : {
      "yesterday" : {
         "date" : "13日星期一",
         "high" : "高温 23℃",
         "fx" : "东北风",
         "low" : "低温 18℃",
         "fl" : "<![CDATA[3-4级]]>",
         "type" : "小雨"
      },
      "city" : "杭州",
      "aqi" : null,
      "forecast" : [
        
         {
            "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[0].position_name | 滨江 | 
| 使用迭代器,获取 data 中 forecast 数组中所有 aqi 的值。 | 从根元素开始,通过 data 对象找到 forecast 数组,使用 [*] 对数组内所有元素进行操作,提取 aqi 属性的值。$.data.forecast[*].aqi | [62,68] | 
| 使用迭代器,获取 forecast 数组中所有的 aqi 值大于等于 60 的 primary_pollutant 值。 | 在整个 JSON 文档中查找 forecast 元素,使用 [?(@.aqi >= 60)] 筛选出 aqi 大于等于 60 的元素,再提取这些元素的 primary_pollutant 属性的值。$..forecast[?(@.aqi >= 60)].primary_pollutant | ['null','null'] | 
| 使用迭代器,获取 data 中 forecast 数组中 aqi 的第一个值。 | 先通过 $.data.forecast[*].aqi 获取 forecast 数组内元素的 aqi 值,再用 [0] 取第一个值。{$.data.forecast[*].aqi}[0] | 62 | 
| 获取 data 中 forecast 数组中 level 等于"良"对象,并获取该对象中 pm25 的值。 | 从 data.forecast 数组中筛选出 level 属性为 "良" 的元素,提取这些元素的 pm25 属性的值。$.data.forecast[?(@.level=="良")].pm25 | [43] | 
| 获取 data 中 forecast 数组中 level 等于"良"且 aqi 等于 62 的所有对象,并获取该对象中 pm10 的值。 | 从 data.forecast 数组中筛选出 level 属性为 "良" 且 aqi 属性为 62 的元素,提取这些元素的 pm10 属性的值。$.data.forecast[?((@.level=="良")&&(@.aqi==62))].pm10 | [73] | 
| 获取 data 中 forecast 数组中 aqi 大于 65 的所有对象,并获取该对象中 position_name 值。 | 从 data.forecast 数组中筛选出 aqi 属性大于 65 的元素,提取这些元素的 position_name 属性的值。$.data.forecast[?(@.aqi>65)].position_name | ["西溪"] | 
2. 实际中的应用场景示例
- 获取数组对象中的某个值
          
            
            
              json
              复制代码
              
            
          
          表达式:$.data.forecast[*].type 获取值为:["多云","中到大雨","多云","小雨","多云"]
         
      
- 获取数组中某个位置的值
          
            
            
              cpp
              复制代码
              
            
          
          表达式:$.data.forecast[*].type 获取值为:["多云","中到大雨","多云","小雨","多云"]
取获取值中第一个值"多云":{$.data.forecast[*].type}[0],依次类推。
         
      
- key中含有特殊值
          
            
            
              json
              复制代码
              
            
          
          {
   "data" : [
      {
         "count(*)" : 123,
         "left(send_address,2)":456
      }
   ]
}
表达式:$.["data"][0]["count(*)"] 获取值为:123
表达式:{$.["data"][0]}['left(send_address,2)'] 获取值为:456
         
      
- 判断不包含
          
            
            
              json
              复制代码
              
            
          
          [
 {
  "supplierId":523,
  "goodsId":55280465,
  "onlineStatus":1,
  "title":"多颜色商品-auto-20161121154939513",
  "importType":1,
 }
]
表达式:{$.[?(@.goodsId == 55280465)]}.containsKey('avgUv7D') 获取值为false
或
表达式:!{$.[?(@.goodsId == 55280465)]}.containsKey('avgUv7D') 获取值为true
或
表达式:$.[?(@.goodsId == 55280465)].[?(@.avgUv7D)] 获取值为[]