先来说说是怎么与JsonPath结缘的吧
接触JsonPath是源于做一个小工具,其实挺简单的一个需求:就是判断众多接口返回的json中http跳转链接能够正常跳转。拿到这个需求后考虑了一下,如果逐个接口去解析的话,肯定是不可能滴,因为每个接口返回的结构都是不一样的,所以这种做法果断放弃,以后的维护成本别甭说了╮(╯▽╰)╭。。后来经过和同事商量后决定采用路径来获取json对象 属性值的方式来实现,于是我上网百度关键字“路径 解析”,发现了这个我现在觉得还很强大的json解析工具,以此记录并和大家一起探讨
一、 简单介绍一下我对jsonpath的理解:
1、JsonPath是一个简单的从文档中抽取指定信息的工具,提供了多种语言版本,包括:Javascript、Java、Python和PHP,(以下我们以java为例来介绍)
2、JsonPath对于JSON来说相当于XPATH对于XML,语法与xml也有相通之处
3、使用JsonPath可以简单快速的来获取想要的json对象的某属性值,这一点在做接口灰盒测试的时候还是相当方便的
4、JsonPath更像一个查询器,可以单条件查询自己想要的元素,也可以复合查询想要的元素
5、JsonPath的底层采用Jsonsmart( 至于JsonSmart具体咋用,还没研究过。。。)
二、使用JsonPath依赖的jar包如下:
如果工程是用maven来管理相关依赖的话,需要在maven的配置文件中加入以下内容:
三、借助网上一张截图,给jsonpath的语法一个快照
四、通过实例快来体验一下jsonpath的强大功能吧
1、首页通过访问接口获取一个json字符串,代码如下:
接口返回的一级结构,newslist、hotvuser、focusimgs均为list
newslist下的某个对象的属性:
2、利用步骤1获取的json字符串 " baores"来看jsonpath的具体使用
a、输出result下的isloadmore所对应的value String checkurl = "$.result.isloadmore";
Boolean boolean1= JsonPath.read(baores, checkurl);
System.out.println(boolean1);
b、输出newslist列表中包含的所有对象 String checkurl2 = "$.result.newslist[*]";
List newslist = JsonPath.read(baores, checkurl2);
System.out.println(newslist);
c、输出newslist列表的第一个对象 Object object = JsonPath.read(baores, "$.result.newslist[0]");
System.out.println(object);
d、输出newslist列表中所有对象对应的属性username List username = JsonPath.read(baores, "$.result.newslist[*].username");
System.out.println(username);
e、输出newslist列表中第一个对象的title String title= JsonPath.read(baores, "$.result.newslist[0].title");
System.out.println(title);
f、输出newslist中mediatype=3的所有的对象 List finallist = JsonPath.read(baores, "$.result.newslist[?(@.mediatype ==3)]");
for(int i =0;i
System.out.println(finallist.get(i));
}
g、输出newslist中赞数大于10的所有对象 List finallist3 = JsonPath.read(baores, "$.result.newslist[?(@.praisenum > 10)]");
for(int i =0;i
System.out.println(finallist3.get(i));
}
h、输出newslist中含有userid的所有对象 List finallist4 = JsonPath.read(baores, "$.result.newslist[?@.userid]");
for(int i =0;i
System.out.println(finallist4.get(i));
}
j、我们还可以先编辑好一个路径,在多个地方重复使用 JsonPath path = JsonPath.compile("$.result.hotvuser");
List userlist = path.read(baores);
for(int i =0;i
System.out.println(userlist.get(i));
}
k、我们还可以自定义过滤器来获取想要的任何元素,可以多条件查询;
下面例子查找: newslist中存在indentifiertype,并且username为 "韩路出品", "车比得" 的对象
Filter filter = Filter.filter(Criteria.where("identifiertype").exists(true).and("username").in("韩路出品", "车比得"));
List finallist5 = JsonPath.read(baores, "$.result.newslist[?]", filter);
for(int i =0;i
System.out.println(finallist5.get(i));
}
Jsonpath的语法就先介绍到这里,其实jsonpath还封装了断言,但是目前这一块还没研究的特别透彻,等啥时候研究明白了再更新此贴 (好尴尬的说。。。)
第一次在社区写帖子,不足之处望大家多多指正,JsonPath 的强大功能等着你我,我们大家继续去挖掘吧