java json字符串传递给 js 时 特殊字符转义错误 研究

一些换行 回车等符号需要转义

主要注意 单引号 与双引号。

一 如果js以 双引号接收字符串 则转单引号 " 至 \" 否则js报错

二 如果js以 单引号接收字符串 则转单引号 ' 至 \' 否则js报错

不管哪种情况 字符串中原有\ 需替换 成 \\

{"Aaa":0,"bbb":1,"ddd":"a哦我\"我'我'哇"}

    ====》

{\"Aaa\":0,\"bbb\":1,\"ddd\":\"a哦我\\\"我'我'哇\"} 双引号接收

{"Aaa":0,"bbb":1,"ddd":"a哦我\\"我\'我\'哇"} 单引号接收

package CN80s.MicroCampus;

import java.util.HashMap;

import java.util.Map;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

import com.alibaba.fastjson.serializer.SerializerFeature;

public class Daaa {

private static SerializerFeature[] features = {

// SerializerFeature.DisableCircularReferenceDetect,

SerializerFeature.DisableCheckSpecialChar,

SerializerFeature.QuoteFieldNames,

SerializerFeature.WriteEnumUsingName,

SerializerFeature.WriteNullNumberAsZero,

SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteMapNullValue

};

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

AAA aa=new AAA();aa.ddd="a哦我\"我'我'哇";

String dc=aa.ddd;

aa.setDdd(dc);

System.out.println(aa.ddd);

String ss=JSON.toJSONString(aa);//,SerializerFeature.WriteNullNumberAsZero

//String sss=JSON.toJSONString(aa, true);

String s1=JSONObject.toJSONString(aa,features);

System.out.println(ss);

System.out.println(s1);

System.out.println("=="+stringToJson(ss,true));

Map < String , Object > jsonMap = new HashMap< String , Object>();

jsonMap.put("a",1);

jsonMap.put("b","");

jsonMap.put("c",null);

jsonMap.put("d","wuzhuti.cn");

String str = JSONObject.toJSONString(jsonMap,features);

System.out.println(str);

net.sf.json.JSONObject ddd=new net.sf.json.JSONObject();

ddd.put("dddd","的撒旦法撒旦法撒'\"旦法'撒旦法");

System.out.println(ddd.toString().replaceAll("'","\\\\'"));

System.out.println("=="+stringToJson(ddd.toString(),true));

}

/**

* java 字符串 转义特殊字符 to js

* @param s

* @param isJSjson 是否给js使用 true 则会转义单引号 \'

* @return

*/

public static String stringToJson(String s,boolean isJSjson){

StringBuffer sb = new StringBuffer();

for(int i=0; i<s.length(); i++){

char c =s.charAt(i);

switch(c){

case'\'': if(isJSjson) {sb.append("\\\'");}else{sb.append("\'");} break;

case'\"': if(!isJSjson) {sb.append("\\\"");}else{sb.append("\"");} break;

case'\\':sb.append("\\\\"); break; //如果不处理单引号,可以释放此段代码,若结合StringDanYinToJSON()处理单引号就必须注释掉该段代码

case'/': sb.append("\\/");break;

case'\b':sb.append("\\b");break;//退格

case'\f':sb.append("\\f");break;//走纸换页

case'\n':sb.append("\\n");break;//换行

case'\r':sb.append("\\r");break;//回车

case'\t':sb.append("\\t");break;//横向跳格

default: sb.append(c);

}}

return sb.toString();

}

/**处理文本中的单引号 和 斜杠*/

public static String StringDanYinToJSON(String ors) {

ors= ors == null ? "" : ors;

StringBuffer buffer = new StringBuffer(ors);

int i = 0;

while(i < buffer.length()) {

if(buffer.charAt(i) == '\'' || buffer.charAt(i) == '\\') {

buffer.insert(i,'\\');

i+= 2;

}else {

i++;

}

}

return buffer.toString();

}

}

输出结果

a哦我"我'我'哇

{"Aaa":0,"bbb":1,"ddd":"a哦我\"我'我'哇"}

{"Aaa":0,"bbb":1,"ccc":"","ddd":"a哦我"我'我'哇"}

=={"Aaa":0,"bbb":1,"ddd":"a哦我\\"我\'我\'哇"}

{"d":"wuzhuti.cn","b":"","c":null,"a":1}

{"dddd":"的撒旦法撒旦法撒\'\"旦法\'撒旦法"}

=={"dddd":"的撒旦法撒旦法撒\'\\"旦法\'撒旦法"}