java 拼接子串的方式做字符串替换生成json

在做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"}

如果用Stringreplace函数的话,要替换一个标签就要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());
		}
	


你可能感兴趣的:(java 拼接子串的方式做字符串替换生成json)