接触 JsonPath 是源于做一个小工具,其实挺简单的一个需求:就是判断众多接口返回的 json 中 http 跳转链接能够正常跳转。拿到这个需求后考虑了一下,如果逐个接口去解析的话,肯定是不可能滴,因为每个接口返回的结构都是不一样的,所以这种做法果断放弃,以后的维护成本别甭说了╮(╯▽╰)╭。。后来经过和同事商量后决定采用路径来获取 json 对象 属性值的方式来实现,于是我上网百度关键字 “路径 解析”,发现了这个我现在觉得还很强大的 json 解析工具,以此记录并和大家一起探讨
1、JsonPath 是一个简单的从文档中抽取指定信息的工具,提供了多种语言版本,包括:Javascript、Java、Python 和 PHP,(以下我们以 java 为例来介绍)
2、JsonPath 对于 JSON 来说相当于 XPATH 对于 XML,语法与 xml 也有相通之处
3、使用 JsonPath 可以简单快速的来获取想要的 json 对象的某属性值,这一点在做接口灰盒测试的时候还是相当方便的
4、JsonPath 更像一个查询器,可以单条件查询自己想要的元素,也可以复合查询想要的元素
5、JsonPath 的底层采用 Jsonsmart( 至于 JsonSmart 具体咋用,还没研究过。。。)
如果工程是用 maven 来管理相关依赖的话,需要在 maven 的配置文件中加入以下内容:
String checkurl = "$.result.isloadmore";
Boolean boolean1= JsonPath.read(baores, checkurl);
System.out.println(boolean1);
String checkurl2 = "$.result.newslist[*]";
List<String> newslist = JsonPath.read(baores, checkurl2);
System.out.println(newslist);
Object object = JsonPath.read(baores, "$.result.newslist[0]");
System.out.println(object);
List<String> username = JsonPath.read(baores, "$.result.newslist[*].username");
System.out.println(username);
String title= JsonPath.read(baores, "$.result.newslist[0].title");
System.out.println(title);
List<Object> finallist = JsonPath.read(baores, "$.result.newslist[?(@.mediatype ==3)]");
for(int i =0;i<finallist.size();i++){
System.out.println(finallist.get(i));
}
List<Object> finallist3 = JsonPath.read(baores, "$.result.newslist[?(@.praisenum > 10)]");
for(int i =0;i<finallist3.size();i++){
System.out.println(finallist3.get(i));
}
List<Object> finallist4 = JsonPath.read(baores, "$.result.newslist[?@.userid]");
for(int i =0;i<finallist4.size();i++){
System.out.println(finallist4.get(i));
}
JsonPath path = JsonPath.compile("$.result.hotvuser");
List<Object> userlist = path.read(baores);
for(int i =0;i<userlist.size();i++){
System.out.println(userlist.get(i));
}
下面例子查找: newslist 中存在 indentifiertype,并且 username 为 "韩路出品", "车比得" 的对象
Filter filter = Filter.filter(Criteria.where("identifiertype").exists(true).and("username").in("韩路出品", "车比得"));
List<Object> finallist5 = JsonPath.read(baores, "$.result.newslist[?]", filter);
for(int i =0;i<finallist5.size();i++){
System.out.println(finallist5.get(i));
}