接口测试 jsonpath 使用初探

fzhbaby for rest-assured · 2016年12月13日 · 最后由 Fresh 回复于 2016年12月14日 · 376 次阅读

先来说说是怎么与 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<String> 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<String> 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<Object> finallist = JsonPath.read(baores, "$.result.newslist[?(@.mediatype ==3)]");
        for(int i =0;i<finallist.size();i++){
            System.out.println(finallist.get(i));
        }
g、输出 newslist 中赞数大于 10 的所有对象
List<Object> finallist3 = JsonPath.read(baores, "$.result.newslist[?(@.praisenum > 10)]");   
        for(int i =0;i<finallist3.size();i++){
            System.out.println(finallist3.get(i));
        }
h、输出 newslist 中含有 userid 的所有对象
List<Object> finallist4 = JsonPath.read(baores, "$.result.newslist[?@.userid]");
        for(int i =0;i<finallist4.size();i++){
            System.out.println(finallist4.get(i));
        }
j、我们还可以先编辑好一个路径,在多个地方重复使用
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));
        }
k、我们还可以自定义过滤器来获取想要的任何元素,可以多条件查询;

下面例子查找: 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));
        }

Jsonpath 的语法就先介绍到这里,其实 jsonpath 还封装了断言,但是目前这一块还没研究的特别透彻,等啥时候研究明白了再更新此贴(好尴尬的说。。。)
第一次在社区写帖子,不足之处望大家多多指正,JsonPath 的强大功能等着你我,我们大家继续去挖掘吧😆
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册