velocity中json转译的问题
今天转义json的特殊字符,一路上磕磕绊绊,几次柳暗花明又一村的感觉,整个过程还是蛮有意思的。
问题:
众所周知,Json是个很脆弱的玩意儿,在json中插入一些特殊字符,如 \n \r等,就会破坏json的整体结构,导致json根本无法被识别。
比如下面这段:{
“code”:’$!ajaxResult.code’,
“message”:’$!ajaxResult.message’,
“datas”:’$!ajaxResult.datas’
}
假设ajaxResult. datas里存了一个\n字符,这段json就会被破坏导致根本无法被识别。
解决这个问题是个很有意思的过事情,经历了一下几个过程
土鳖方案:
String的replaceAll方法:直接在velocity中写$!ajaxResult.datas.replaceAll(“\n”,””).replaceAll(“\r”,””)。将那些祸害大局的特殊字符通通替换为空。
2.用javaScriptUtils
因为Json里的特殊字符并非只有\n \r,偶尔插入的一个”\”导致整个json请求的失败,而且强制将这些字符格杀勿论也并不合理,万一业务方就想换下行呢(这个有点钻牛角尖了),
于是用了org.springframework.web.util.JavaScriptUtils.javaScriptEscape(String),将特殊字符前面都加了\强行转译。
代码如下:
StringBuffer filtered = new StringBuffer(input.length());
char prevChar = ‘\u0000′;
char c;
for (int i = 0; i < input.length(); i++) {
c = input.charAt(i);
if (c == ‘”‘) {
filtered.append(“\\\”");
}
else if (c == ‘\”) {
filtered.append(“\\’”);
}
else if (c == ‘\\’) {
filtered.append(“\\\\”);
}
else if (c == ‘/’) {
filtered.append(“\\/”);
}
else if (c == ‘\t’) {
filtered.append(“\\t”);
}
else if (c == ‘\n’) {
if (prevChar != ‘\r’) {
filtered.append(“\\n”);
}
}
else if (c == ‘\r’) {
filtered.append(“\\n”);
}
else if (c == ‘\f’) {
filtered.append(“\\f”);
}
else {
filtered.append(c);
&