GenericTokenParser的parse方法
public String parse(String text) {
StringBuilder builder = new StringBuilder();
if (text != null && text.length() > 0) {
char[] src = text.toCharArray();
int offset = 0;
// 循環遍歷{"mobile":"${encryptMobile}","inTimeStamp":"${inTimeStamp}"}
// 判斷是不是有"${" 這個字符串 如果沒有start=-1 則跳過循環
for(int start = text.indexOf(this.openToken, offset); start > -1; start = text.indexOf(this.openToken, offset)) {
if (start > 0 && src[start - 1] == '\\') {
builder.append(src, offset, start - offset - 1).append(this.openToken);
offset = start + this.openToken.length();
} else {
int end = text.indexOf(this.closeToken, start);
if (end == -1) {
builder.append(src, offset, src.length - offset);
offset = src.length;
} else {
builder.append(src, offset, start - offset);
offset = start + this.openToken.length();
String content = new String(src, offset, end - offset);
// 調用handleToken動態添加內容
builder.append(this.handler.handleToken(content));
offset = end + this.closeToken.length();
}
}
}
if (offset < src.length) {
builder.append(src, offset, src.length - offset);
}
}
return builder.toString();
}
實現動態拼接參數JSONString,首先創建一個解析參數的類
public class MapVariablesParser {
public static String parse(String string, Map<String,Object> variables) {
MapVariableTokenHandler handler = new MapVariableTokenHandler(variables);
GenericTokenParser parser = new GenericTokenParser("${", "}", handler);
return parser.parse(string);
}
private static class MapVariableTokenHandler implements TokenHandler {
private Map<String,Object> variables;
public MapVariableTokenHandler(Map<String,Object> variables) {
this.variables = variables;
}
@Override
public String handleToken(String content) {
if (variables != null && variables.containsKey(content)) {
return variables.get(content).toString();
}
return "${" + content + "}";
}
}
}
示例
public static void main(String[] args) {
String params = "{\"user_id\":\"${userId}\",\"endTime\":\"${inTimeStamp}\",\"startTime\":\"${startTimeStamp}\",\"token\":\"user_agent_message\",\"limit\":\"10\",\"tags\":\"\"}";
long now = System.currentTimeMillis();
Map<String, Object> variables = Maps.newHashMap();
variables.put("userId", "007");
variables.put("channel", "weibo");
variables.put("query_source", "dw_agg_user_agent_message");
variables.put("startTimeStamp",now);
long end = System.currentTimeMillis();
variables.put("inTimeStamp",end);
String parse = MapVariablesParser.parse(params, variables);
System.out.println(JSONObject.toJSONString(parse));
}
運行結果:
"{\"user_id\":\"007\",\"endTime\":\"1588926061438\",\"startTime\":\"1588926061419\",\"token\":\"user_agent_message\",\"limit\":\"10\",\"tags\":\"\"}"