一:JSONPath说明:
JSONPath是一种通过配置正则表达式语法,抽取json中的指定数据的一种类库;
二:需要的jar依赖(依赖阿里巴巴的fastjson.jar)
maven用户可通过maven远程仓库获取配置地址
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
非maven项目,可下载fastjson.jar导入
三:JSONPath通配符
| JSONPath正则表达式 | 说明: |
| $ | 根元素 |
| @ | 当前元素 |
| * | 通配符,表示任意元素 |
| .. | 递归搜索,深层扫描 |
| . | 子节点元素 |
| [i] | 数组下标 i 下的数据,i为正为正序,i为负为倒叙 |
| [start:end] | 数组片段,区间是[start:end], |
| [?()] | 过滤表达式 |
| <,>,>=,<=,!=,=~, | 搭配操作符使用 |
| length() | 搭配函数使用 |
案例:有以下json数据:jsonDataStr

1.递归遍历所有age字段:"$..age"
Object obj1 = JSONPath.read(jsonDataStr, "$..age");
System.out.println("所有age字段:\n"+obj1.toString());
控制台输出:

2.查找grade下的所有字段数据 :$.grade.*(截图不全,这种方式很少用)
Object obj2 = JSONPath.read(jsonDataStr, "$.grade.*");
System.out.println("grade下的所有字段数据 \n"+obj2.toString());
控制台输出:
![]()
3.通过下标获取数组的指定数据 :$.grade.class[1],$.grade.class[-1],因为数组下标从0 开始,所以下标为1获取的是第二个数据,这里-0按照下标为0处理了,所以-1输出的是倒数第一个数据
Object obj7 = JSONPath.read(jsonDataStr, "$.grade.class[1]");
System.out.println("数组角标为1的数据: \n"+obj7.toString());
Object obj8 = JSONPath.read(jsonDataStr, "$.grade.class[-1]");
System.out.println("数组角标为-1的数据: \n"+obj8.toString());
控制台输出:

4.数组片段,区间输出
//输出数组class中从下标1开始到结束
Object obj5 = JSONPath.read(jsonDataStr, "$.grade.class[1:]");
System.out.println(obj5.toString());
//输出数组class 中下标从0开始,到下标为1结束
Object obj9 = JSONPath.read(jsonDataStr, "$.grade.class[:1]");
System.out.println(obj9.toString());
//输出数组class 中下标从1开始到下标为2结束
Object obj6 = JSONPath.read(jsonDataStr, "$.grade.class[1:2]");
System.out.println(obj6.toString());
//输出数组class 中倒数第二个到结束
Object obj10 = JSONPath.read(jsonDataStr, "$.grade.class[-2:]");
System.out.println(obj10.toString());
//输出数组class 中下标从0开始到倒数第三条数据时结束
Object obj14 = JSONPath.read(jsonDataStr, "$.grade.class[:-3]");
System.out.println(obj14.toString());
数据太多,这里不一一打印;
5.过滤表达式:
//输出class数组中含有classTea的数组字段,这里数组的第二条数据将不输出
Object obj11 = JSONPath.read(jsonDataStr, "$.grade.class[?(@.classTea)]");
System.out.println(obj11.toString());
//输出class数组中age字段大于12的列,注意:age的value值为int类型
Object obj12 = JSONPath.read(jsonDataStr, "$..class[?(@.age>12)]");
System.out.println(obj12.toString());
//class数组的length数组长度
Object obj13 = JSONPath.read(jsonDataStr, "$..class.length()");
System.out.println("class 的数组长度:"+obj13.toString());

个人整理,有很多不全的地方,欢迎大家提问讨论,
更多JSONPath 点我















