如何处理Json数据的换行符等fastjson特殊字符处理

24889人阅读
这个问题的核心就是解析字串时会有两次转义。
---------------------------------------------------
转义字符(\)对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 = {&
b : &\\&,&
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&:&\\\\&}}}'));输出结果如下图&
根据转义规则,实际输出一个\在这个\之前必定有一个\。所以如上第一行输出按照书写来说为'{&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.parse将json字符串转换成json对象的时候会出错,主要是双引号,回车换行等影响明显,左尖括号和右尖括号也会导致显示问题,所以要在输出到页面进行json对象转换之前将一些特殊符合进行编码或转义,下面展示的是C#代码编码和转义几个常用特殊字符。经过笔者测试,将这些符号编码和转义之后,大部分json字符串都可以转换成json对象了。如果遇到个别问题,应朝着这个方向去查找问题。
注意:\r是回到行首,\n是新启一行,这两个一般同时出现,应该同时处理。
补充:文字中间的换行,空格在数据库里面不以\r\n,&;等形式显示出来(“本书”与“前80”之间换行,“由”与“曹雪芹”之间空格)
原文出处:http://blog.csdn.net/dotNET25/article/details/
-------------------------------------------下面这个和上面文章类似,替换的字符不一样,那个比较好还不知道。。----------------
java 中JSON数据特殊字符的处理
JSon 数据中的String 传递数据时,需要处理好特殊字符&
1 :引号&& 如果是使用单引号,来括值的话,那String 中& '& 单引号为特殊字符&
2:正斜杠,反斜杠,换行符号等。另外,必须用
(&) 而非 (') 表示字符串:&
Java代码&&
static&StringBuffer&string2Json(String&s)&{&&&&&&&
&&&&StringBuffer&sb&=&new&StringBuffer&();&&&&&&&
&&&&for&(int&i=0;&i&s.length();&i++)&{&&&&&&&
&&&&&&&&char&c&=&s.charAt(i);&&&&&&&
&&&&&&&&switch&(c)&{&&&&&&&
&&&&&&&&case&'\&':&&&&&&&
&&&&&&&&&&&&sb.append(&\\\&&);&&&&&&&
&&&&&&&&&&&&break;&&&&&&&
&&&&&&&&case&'\\':&&&&&&&
&&&&&&&&&&&&sb.append(&\\\\&);&&&&&&&
&&&&&&&&&&&&break;&&&&&&&
&&&&&&&&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();&&&&&&&
文章出处:/blog/983918
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Java到JSON特殊字符转换
由于从服务器后端生成JSON格式的字符串,最后传递到客户端由 eval() 函数动态的生成Javascript,如果JSON字符串格式错误,则eval解析会出错,经常也是最常出错的是&& ' \r\n& 这三个字符,如 {name:'I'am'}解析时会出错,同样,由于JavaScript中的字符串可由单引号也可由双引号引起来,所以双引号一样也有这样问题。另外,字符串是不能跨行写的,即你不能写成这样:{name:&I'
所以这3个需要转换,另外换行可能依赖于平台,所以 \n 也需要转换,比如我们需要将后台抛出的异常栈信息以JSON的格式传回到浏览器上显示时,就需要将回车换行转换。代码如下:
Java代码&&
response.setContentType(&application/json&);&&
Writer&wr&=&response.getWriter();&&
if(exceptionTrace.indexOf(&'&)!=-1){&&
&&&&exceptionTrace&=&exceptionTrace.replaceAll(&'&,&&\\'&);&&
if(exceptionTrace.indexOf(&\&&)!=-1){&&
&&&&exceptionTrace&=&exceptionTrace.replaceAll(&\&&,&&\\\&&);&&
if(exceptionTrace.indexOf(&\r\n&)!=-1){&&
&&&&exceptionTrace&=&exceptionTrace.replaceAll(&\r\n&,&&\\u000d\\u000a&);&&
if(exceptionTrace.indexOf(&\n&)!=-1){&&
&&&&exceptionTrace&=&exceptionTrace.replaceAll(&\n&,&&\\u000a&);&&
wr.write(&{success:false,exception:true,msg:'&&+exceptionTrace&+&&'}&);&&
wr.flush();&&
wr.close();&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:48866次
排名:千里之外
转载:24篇
(1)(3)(6)(1)(4)(2)(4)(4)暂无相关文章
感谢本文作者
昵称:胡萝卜
加入时间: 0:00:00
这家伙很懒,虾米都没写
以下内容也很赞哦json格式如何读取有特殊字符的数据!内详!
var sogou_ad_id=731547;
var sogou_ad_height=160;
var sogou_ad_width=690;

我要回帖

更多关于 php json特殊字符处理 的文章

 

随机推荐