1、假如一个接口返回的格式如上,需要提取ad的值,
1)String e="${a}=live:0/course:0/ad";这是我定义的提取格式书写,"="左边是要存储的变量名称,右边是真正要提取的格式,层级以"/"标识,如果遇到数组,则写成key:索引,0代表第一个,依次类推,需要从根目录的key开始,不能跨越
private void extractionValue(String report,String string){//report:接口的返回值,string:自己要提取的整条字符串,就是上面的e
String before=StringUtils.substringBefore(string,"=");//需要存储的可变参数
String after=StringUtils.substringAfter(string,"=");//要获取的字符串
Object json01 = JSONObject.parse(report);
if(after.contains("/")){//
多层级结构
String finalReport=report;
String[] su=after.split("/");
if(su!=null&&su.length>0){//
有数据
for(int i=0;ilength;i++){
String item=su[i];
if(item.contains(":")){//
代表是数组
finalReport= ((Map)JSONObject.parse(finalReport)).get(item.substring(0,item.indexOf(":"))).toString();
JSONArray bookinfos=JSON.parseArray(finalReport);
json01 = JSONObject.parse(bookinfos.get(Integer.parseInt(item.substring(item.indexOf(":")+1))).toString());
finalReport=json01.toString();
}else{
finalReport= ((Map)json01).get(item).toString();
}
}
GlobalVariable.put(before,finalReport);
}
}else{//
根目录的数据
GlobalVariable.put(before,((Map)json01).get(after).toString());
}
System.out.println("测试结果"+before+" "+GlobalVariable.get(before));
}
这里面需要用到fastjson,这是我能想到的一种方法,可以用在自动化接口中
2)正则匹配,这个是比较简单的,当有多个重复的字段
如果提取的是数字:String regex="(?<=\"id\":)([0-9]*)";
如果提取的是字符串:String regex="(?<=\"name\":)\"(.+?)\"";
Pattern p=Pattern.compile(regex); Matcher m=p.matcher(f); while(m.find()){ System.out.println(m.group(1)); }
扩展:当一个结果中出现多个重复的参数,这在列表接口中会出现,这时就需要对上面的正则表达方法封装
//report:接口返回值 regex:正则匹配表达式 index:这个值出现的索引,就是需要第几次出现的这个值
private String extractionValue(String report,String regex,int index){
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(report);
int num=0;
while(m.find()){
if(num==index){
return m.group(1);
}
num++;
}
return null;
}
注:如果大家有别的思路,可互相交流
网友评论