由json字串生成json对象时的转义问题

这个问题的核心就是解析字串时会有两次转义。


---------------------------------------------------
转义字符(\)对JavaScript中JSON.parse的影响概述


JSON是一个提供了stringify和parse方法的内置对象,前者用于将js对象转化为符合json标准的字符串,后者将符合json标准的字符串转化为js对象,本文为大家介绍下转义字符对JSON.parse方法的影响。


按照ECMA262第五版中的解释,JSON是一个提供了stringify和parse方法的内置对象,前者用于将js对象转化为符合json标准的字符串,后者将符合json标准的字符串转化为js对象。json标准参考<a href="http://json.org/" target="_blank">json.org</a>。(其实将符合json标准的字符串转化为js对象可以用eval,但是eval性能相对差且存在安全隐患(会执行json字符串中的代码),本文写的是转义字符对JSON.parse方法的影响。 

一般来说在JSON.parse的参数包含转移字符的时候会遇到两次转义的问题,其实第一次是字符串本身的转义,第二次是将真正转为js对象的转义。 

举例如下: 
例子一:将字符串'{"a":"b","b":"\\\\"}'传递给JSON.parse,首先解析器提取单引号括起来的字符串时认为第一个\转义第二个\ 第三个\转义第四个\,也就是说实际可输出字符串是{"a":"b","b":"\\"}(可通过console.log('{"a":"b","b":"\\\\"}')验证),之后正式转为js对象的时候还有一次转义,也就是实际输出字符转中的第一个\转义第二个\(此时只有两个\)。所以console.log(JSON.parse('{"a":"b","b":"\\\\"}') );输出结果为Object {a: "b", b: "\"},也就是说实际显示的数据为一个\(实际可输出一个\说明在此之前还有一个\)。 
例子二: 
var obj = { 
a : "b", 
b : "\\", 
c : { 
b : "\\", 
a : { 
b : "\\" 


}; 
var json_str = JSON.stringify(obj); 
console.log( JSON.stringify(obj) ); 
console.dir(JSON.parse(json_str)); 
console.dir(JSON.parse('{"a":"b","b":"\\\\","c":{"b":"\\\\","a":{"b":"\\\\"}}}'));输出结果如下图 
pic 
根据转义规则,实际输出一个\在这个\之前必定有一个\。所以如上第一行输出按照书写来说为'{"a":"b","b":"\\\\","c":{"b":"\\\\","a":{"b":"\\\\"}}}',可通过第三条输出来验证。 
总结,如果想在js对象中出现一个\,需要在json字符串中出现四个\ 。 

对于其他的其他的特殊字符 
1.双引号("),如果正确出现双引号应为\\\" 
2.\n,如想想出现正确的换行需要json字符串中是\\n,其实是先对\n中的\转义,n变成了普通字符,在解析为js对象的时候n与之前的\(只有一个\了)被解释为换行。如下的两个与此类似。 
3.\r,\\r 
4.\t,\\t 


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

特殊字符导致json字符串转换成json对象出错

在对数据库取出来的数据(特别是描述信息)里面含有特殊字符的话,使用JSON.parse将json字符串转换成json对象的时候会出错,主要是双引号,回车换行等影响明显,左尖括号和右尖括号也会导致显示问题,所以要在输出到页面进行json对象转换之前将一些特殊符合进行编码或转义,下面展示的是C#代码编码和转义几个常用特殊字符。经过笔者测试,将这些符号编码和转义之后,大部分json字符串都可以转换成json对象了。如果遇到个别问题,应朝着这个方向去查找问题。

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.             theString = theString.Replace(">""&gt;");  
  2.             theString = theString.Replace("<""&lt;");  
  3.             theString = theString.Replace(" ""&nbsp;");  
  4.             theString = theString.Replace("\"""&quot;");  
  5.             theString = theString.Replace("\'""&#39;");  
  6.             theString = theString.Replace("\\", "\\\\");//对斜线的转义  
  7.             theString = theString.Replace("\n""\\n");  //注意php中替换的时候只能用双引号"\n"
  8.             theString = theString.Replace("\r""\\r");  

注意:\r是回到行首,\n是新启一行,这两个一般同时出现,应该同时处理。


补充:文字中间的换行,空格在数据库里面不以\r\n,&nbsp;;等形式显示出来(“本书”与“前80”之间换行,“由”与“曹雪芹”之间空格)

文字:


数据库:

原文出处:http://blog.csdn.NET/dotNET25/article/details/24475437


-------------------------------------------下面这个和上面文章类似,替换的字符不一样,那个比较好还不知道。。----------------


Java 中JSON数据特殊字符的处理


JSon 数据中的String 传递数据时,需要处理好特殊字符 
1 :引号   如果是使用单引号,来括值的话,那String 中  '  单引号为特殊字符 
2:正斜杠,反斜杠,换行符号等。另外,必须用 (") 而非 (') 表示字符串: 

Java代码   收藏代码
  1. static StringBuffer string2Json(String s) {       
  2.     StringBuffer sb = new StringBuffer ();       
  3.     for (int i=0; i<s.length(); i++) {       
  4.      
  5.         char c = s.charAt(i);       
  6.         switch (c) {       
  7.         case '\"':       
  8.             sb.append("\\\"");       
  9.             break;       
  10.         case '\\':       
  11.             sb.append("\\\\");       
  12.             break;       
  13.         case '/':       
  14.             sb.append("\\/");       
  15.             break;       
  16.         case '\b':       
  17.             sb.append("\\b");       
  18.             break;       
  19.         case '\f':       
  20.             sb.append("\\f");       
  21.             break;       
  22.         case '\n':       
  23.             sb.append("\\n");       
  24.             break;       
  25.         case '\r':       
  26.             sb.append("\\r");       
  27.             break;       
  28.         case '\t':       
  29.             sb.append("\\t");       
  30.             break;       
  31.         default:       
  32.             sb.append(c);       
  33.     }  
  34.     return sb.toString();       
  35.  }    

文章出处:http://yancc.iteye.com/blog/983918


--------------------------------------------------------------------------------------------------------------------------------------------------------------

Java到JSON特殊字符转换

由于从服务器后端生成JSON格式的字符串,最后传递到客户端由 eval() 函数动态的生成Javascript,如果JSON字符串格式错误,则eval解析会出错,经常也是最常出错的是 " ' \r\n  这三个字符,如 {name:'I'am'}解析时会出错,同样,由于JavaScript中的字符串可由单引号也可由双引号引起来,所以双引号一样也有这样问题。另外,字符串是不能跨行写的,即你不能写成这样:{name:"I'

am"}

所以这3个需要转换,另外换行可能依赖于平台,所以 \n 也需要转换,比如我们需要将后台抛出的异常栈信息以JSON的格式传回到浏览器上显示时,就需要将回车换行转换。代码如下:

 

Java代码   收藏代码
  1. response.setContentType("application/json");  
  2.   
  3. Writer wr = response.getWriter();  
  4.   
  5. if(exceptionTrace.indexOf("'")!=-1){  
  6.     //将单引号转义一下,因为JSON串中的字符串类型可以单引号引起来的  
  7.     exceptionTrace = exceptionTrace.replaceAll("'""\\'");  
  8. }  
  9. if(exceptionTrace.indexOf("\"")!=-1){  
  10.     //将双引号转义一下,因为JSON串中的字符串类型可以单引号引起来的  
  11.     exceptionTrace = exceptionTrace.replaceAll("\"""\\\"");  
  12. }  
  13.   
  14. if(exceptionTrace.indexOf("\r\n")!=-1){  
  15.     //将回车换行转换一下,因为JSON串中字符串不能出现显式的回车换行  
  16.     exceptionTrace = exceptionTrace.replaceAll("\r\n""\\u000d\\u000a");  
  17. }  
  18. if(exceptionTrace.indexOf("\n")!=-1){  
  19.     //将换行转换一下,因为JSON串中字符串不能出现显式的换行  
  20.     exceptionTrace = exceptionTrace.replaceAll("\n""\\u000a");  
  21. }  
  22.   
  23. wr.write("{success:false,exception:true,msg:'" +exceptionTrace + "'}");  
  24. wr.flush();  
  25. wr.close(); 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值