标签:
在做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());
}
标签:
原文地址:http://blog.csdn.net/li6wen9zhi/article/details/51361088