在做rest接口测试过程中,需要给定模板用数据生成一批的json串
例如Json模板示例如下
{"school":{"num":"122121","addr":"@addr"},"name":"@name","age":"@age"}
来源数据示例如下
Test |
name |
age |
addr |
test1 |
name1 |
12 |
第一大街 |
test2 |
name2 |
13 |
第一大街 |
其输出应该如下
TestCase |
Json |
test1 |
{"school":{"num":"122121","addr":"第一大街"},"name":"name1","age":"12"} |
test2 |
{"school":{"num":"122121","addr":"第一大街"},"name":"name2","age":"13"} |
如果用String的replace函数的话,要替换一个标签就要replace生成一个新串,如果是生成大量数据的话,肯定影响性能。后来也考虑过用类似String format函数,把要替换的位置都写成一样的%s,然后传递一个数组给他顺序写,但是这样必须记号数据的顺序,写数据时不太方便。希望功能如例子一样,用标签来标记,方便写数据时定位。
我采用的方法是找到所有标记的子串的位置,然后在整串把这些子串都剪掉生成子串组,然后再生成时,就可以用这些子串拼接成新串,具体代码如下,
String json=this.ReadJSON(); //map4int map4str用于排序 TreeMap<Integer,Integer> map4int = new TreeMap<Integer,Integer>(); TreeMap<Integer,String> map4str = new TreeMap<Integer,String>(); List<String> sortString=new ArrayList<String>(); //title 用于保存要替换的字符串 //table保存了 替换的字符串和它对应的要替换的数据list String[] title=er.readExcelTitle(); Map<String,List<String>>table=er.readExcelContent( ); //找到要替换的字符串在json字符串中的位置 并排序 for(String t:title){ int index=json.indexOf("@"+t); if(index!=-1){ map4int.put(index, index+t.length()); map4str.put(index, t); } } //sortString 用于按出现位置保存所有要替换的串 for(Entry<Integer,String> e:map4str.entrySet()){ sortString.add(e.getValue()); } //strs用于保存json去除掉替换字符串后的所有子串 List<String>strs=new ArrayList<String>(); int start=0;int end=0; for(Map.Entry<Integer,Integer> e:map4int.entrySet()){ end=e.getKey(); if(end>start) { strs.add(json.substring(start, end)); start=e.getValue()+1; } } strs.add(json.substring(start)); //然后对于每组数据 将子串拼接成一个整串 StringBuilder sb=new StringBuilder(); List<String> jsons=new ArrayList<String>(); for(int i=0;i<rowcnt;i++){ for(int j=0;j<strs.size()-1;j++){ sb.append(strs.get(j)); sb.append(table.get(sortString.get(j)).get(i)); } sb.append(strs.get(strs.size()-1)); jsons.add(sb.toString()); sb.delete(0, sb.length()); }