日期:2014-05-16  浏览次数:20463 次

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);

&