① 如何处理JSON中的特殊字符
JSON 是适用于 Ajax 应用程序的一种有效格式,原因是它使 JavaScript 对象和字符串值之间得以快速转换。由于 Ajax
应用程序非常适合将纯文本发送给服务器端程序并对应地接收纯文本,相比不能生成文本的 API,能生成文本的 API 自然更可取;而且,JSON 让您能够处理本地
JavaScript 对象,而无需为如何表示这些对象多费心思。
XML 也可以提供文本方面的类似益处,但用于将 JavaScript 对象转换成 XML 的几个现有 API 没有 JSON API
成熟;有时,您必须在创建和处理 JavaScript 对象时格外谨慎以确保所进行的处理能与所选用的 XML 会话 API 协作。但对于
JSON,情况就大不相同:它能处理几乎所有可能的对象类型,并会返回给您一个非常好的 JSON 数据表示。 因此,JSON 的最大价值在于可以将
JavaScript 真的作为 JavaScript 而非数据格式语言进行处理。
您所学到的所有有关使用 JavaScript 对象的技巧都可以应用到代码中,而无需为如何将这些对象转变成文本而多费心思。
1. 回车问题
JSON传值的时候,如果有回车符就会挂的。我们可以使用正则来去掉回车符:
view
source
print?
1
$str = preg_replace("'([\r\n])[\s]+'", "", $str);
2
3
// 不用正则
4
$str = str_replace("\n","",$str);
转出来的字符串就没有回车符的困扰了。
顺便记录一个PHP过滤脚本:
view
source
print?
01
<?php
02
// $document 应包含一个 HTML 文档。
03
// 本例将去掉 HTML 标记,javascript 代码
04
// 和空白字符。还会将一些通用的
05
// HTML 实体转换成相应的文本。
06
07
$search = array ("'<script[^>]*?>.*?</script>'si", // 去掉 javascript
08
"'<[\/\!]*?[^<>]*?>'si", // 去掉 HTML 标记
09
"'([\r\n])[\s]+'", // 去掉空白字符
10
"'&(quot|#34);'i", // 替换 HTML 实体
11
"'&(amp|#38);'i",
12
"'&(lt|#60);'i",
13
"'&(gt|#62);'i",
14
"'&(nbsp|#160);'i",
15
"'&(iexcl|#161);'i",
16
"'&(cent|#162);'i",
17
"'&(pound|#163);'i",
18
"'&(|#169);'i",
19
"'(\d+);'e"); // 作为 PHP 代码运行
20
21
$replace = array ("",
22
"",
23
"\\1",
24
"\"",
25
"&",
26
"<",
27
">",
28
" ",
29
chr(161),
30
chr(162),
31
chr(163),
32
chr(169),
33
"chr(\\1)");
34
35
$text = preg_replace ($search, $replace, $document);
36
?>
2. HTML特殊字符
从服务器端以JSON格式将数据传递到客户端后,通过JS显示在HTML页面时,有一些特殊字符不能直接显示,如后台传递过来的是
'<b>msg</b> #' 通过JS显示在HTML页面中时,显示成了 msg # ,并不是msg
#,这是由于<与>之间的内容看作是HTML标签了,而以&开头的 与#为HTML实体,所以显示不正常。
解决办法很简单,在JS将其渲染到HTML页面前转换一下即可:
view
source
print?
01
<script type="text/javascript">
02
var str = '<b>msg</b> #';
03
document.all.div1.innerHTML='<pre>'+str+'</pre>';
04
05
//js中的字符串正常显示在HTML页面中
06
String.prototype.displayHtml= function(){
07
//将字符串转换成数组
08
var
strArr = this.split('');
09
//HTML页面特殊字符显示,空格本质不是,但多个空格时浏览器默认只显示一个,所以替换
10
var
htmlChar="&<>";
11
for(var
i = 0; i< str.length;i++){
12
//查找是否含有特殊的HTML字符
13
if(htmlChar.indexOf(str.charAt(i)) !=-1){
14
//如果存在,则将它们转换成对应的HTML实体
15
switch
(str.charAt(i)) {
16
case
'<':
17
strArr.splice(i,1,'<');
18
break;
19
case
'>':
20
strArr.splice(i,1,'>');
21
break;
22
case
'&':
23
strArr.splice(i,1,'&');
24
}
25
}
26
}
27
return
strArr.join('');
28
}
29
alert(str.displayHtml());
30
document.all.div2.innerHTML=str.displayHtml();
31
</script>
3. escape()函数
该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成 Web 可用字符(比如,空格会被转换成
%20,浏览器并不会将其视为空格处理,而是不做更改,将其直接传递到服务器)。之后,服务器会(通常自动)再把它们转换回它们传输后的本来 “面目”。
view
source
print?
1
var url = "nowamagic.php?people="
+ escape(people.toJSONString());
2
request.open("GET", url, true);
3
request.onreadystatechange = updatePage;
4
request.send(null);
这种做法的缺点有两个: 在使用 GET 请求发送大块数据时,对 URL 字符串有长度限制。虽然这个限制很宽泛,但对象的 JSON
字符串表示的长度可能超出您的想象,尤其是在使用极其复杂的对象时更是如此。在跨网络以纯文本发送所有数据的时候,发送数据面临的不安全性超出了您的处理能力。
简言之,以上是 GET 请求的两个限制,而不是简单的两个与 JSON
数据相关的事情。在想要发送用户名和姓之外的更多内容,比如表单中的选择时,二者可能会需要多加注意。若要处理任何机密或极长的内容,可以使用 POST 请求。
4. 引号问题
JSON中如果包含引号或双引号,会破坏JSON的格式。有两种方法可以解决。
在入库的时候可以使用addslashes()函数处理一下字符串,给引号前加上斜杠。被改的字符包括单引号 (')、双引号 (")、反斜线 backslash
(\) 以及空字符NULL。
view
source
print?
1
$text = addslashes($text);
JavaScript的话,可以这样:
view
source
print?
1
function valueReplace(v){
2
v=v.toString().replace(new
RegExp('(["\"])', 'g'),"\\\"");
3
return
v;
4
}
5
var eValue = encodeURI($.trim(valueReplace(e.value)))
② java : json 过滤不合法字符的工具包工具类工具
json中没有自带的过滤不合法字符的工具类,需要用户自己编写。
将源数据中的'、回"、\\、空格、换行答等都替换成转义符,这样你拼接的json数据就是正常的,显示出来格式和数据库中的一样。
function valueReplace(v) {
if (v.indexOf("\"") != -1) {
v = v.toString().replace(new RegExp('(["\"])', 'g'), "\\\"");
}
else if (v.indexOf("\\") != -1)
v = v.toString().replace(new RegExp("([\\\\])", 'g'), "\\\\");
return v;
}
③ 抓取苹果json数据,怎样过滤特殊字符
packagecn.sdeit.servlet;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
importjava.util.Calendar;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importcn.sdeit.beans.Team;
importcn.sdeit.beans.User;
importcn.sdeit.mysql.ConnectMySql;
@WebServlet(name="BuildTeam",urlPatterns={"/BuildTeam"})
{
=1L;
publicBuildTeam()
{
();
}
protectedvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException
{
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
Teamteam=newTeam(request.getParameter("name"),
newInteger(request.getParameter("type")),
request.getParameter("words"),
((User)(request.getSession().getAttribute("oldUser"))).getEmail(),
"null","null","null","null","null",
"null","null",request.getParameter("teacher"),0,
Calendar.getInstance().get(Calendar.YEAR)
);
intresult=buildTeam(team);
if(result==0)
{
PrintWriterwriter=response.getWriter();
writer.write("抱歉!</br>创建团队失败!请核对资料后重试,若问题再次出现请联系管理员反馈您的问题!");
writer.flush();
writer.close();
}
else
{
response.sendRedirect("mine.jsp");;
}
}
privateintbuildTeam(Teamteam)
{
/*
*createtableteam
*(namevarchar(64),
*typeint,
*wordsvarchar(256),
*member1varchar(24)defaultnull,
*member2varchar(24)defaultnull,
*member3varchar(24)defaultnull,
*member4varchar(24)defaultnull,
*member5varchar(24)defaultnull,
*member6varchar(24)defaultnull,
*filevarchar(128),
*rewardvarchar(64),
*teachervarchar(24),
*chargeint,
*yearint);
*/
Stringsql="insertintoteamvalues(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
Connectionconnection=ConnectMySql.createConnection();
PreparedStatementprepared=ConnectMySql.createPreparedStatement(connection,sql);
intcode=0;
try
{
prepared.setString(1,team.getName());
prepared.setInt(2,team.getType());
prepared.setString(3,team.getWords());
prepared.setString(4,team.getMember1());
prepared.setString(5,team.getMember2());
prepared.setString(6,team.getMember3());
prepared.setString(7,team.getMember4());
prepared.setString(8,team.getMember5());
prepared.setString(9,team.getMember6());
prepared.setString(10,team.getFile());
prepared.setString(11,team.getReward());
prepared.setString(12,team.getTeacher());
prepared.setInt(13,team.getCharge());
prepared.setInt(14,team.getYear());
code=prepared.executeUpdate();
prepared.close();
connection.close();
}catch(SQLExceptione)
{
e.printStackTrace();
}
returncode;
}
}
④ json数据中有特殊字符,该如何处理
1. 回车问题
JSON传值的复时候制,如果有回车符就会挂的。我们可以使用正则来去掉回车符:
1 $str = preg_replace("'([\r\n])[\s]+'", "", $str);
2
3 // 不用正则
4 $str = str_replace("\n","",$str);
转出来的字符串就没有回车符的困扰了。
顺便记录一个PHP过滤脚本:
01 <?php
02 // $document 应包含一个 HTML 文档。
03 // 本例将去掉 HTML 标记,javascript 代码
04 // 和空白字符。还会将一些通用的
05 // HTML 实体转换成相应的文本。
⑤ jsonpath怎么过滤掉一个字符串的前几个字符
你这个不算标准的JSON格式数据,可以先将\"替换成"即可。
再用json_decode()系统函数将其转为json对象,如版需转为数组加上第二权个参数为true即可。
若仍输出为NULL,是由于存在BOM头信息,
$arr = json_decode(trim($json,chr(239).chr(187).chr(191)),true);
转换即可。
⑥ 如何过滤掉json字符串里面的反斜杠
原来你说的是抄http后面的反斜杠,那个的袭确是数据本身的错误,但是我有点不敢相信,QQ居然会犯这种低级错误,看来树大有蛀虫啊,写这接口的人水平不行,自己进行Json字符串拼接的时候,多输出了一次反斜杠。
对于这种错误数据,既然你已经知道问题了,那么处理也不难,只要对反序列化后的结果处理下即可,将figureurl属性中的“http:\/\/”替换为"http://"就没事了,如果所有的http://都是这个德性,你也可以直接原始字符串匹配替换,匹配所有“http:\/\/”替换为"http://"
⑦ js过滤json数据特殊字符
用replace函数替换
例如替换换行为空格
text.replace(/\n+/,' ')
⑧ 如何避免fastjson对于unicode码的\uxxxx格式中\进行特殊字符过滤
System.out.println(JSON.toJSONString(1", SerializerFeature.BrowserCompatible));
System.out.println(JSON.toJSONString("\u4E2D\u56FD", SerializerFeature.BrowserCompatible));
⑨ 为了保证返回的json数据正确以及标准,aps服务器端返回json数据时需要过滤哪些字符
你可以看一下js对哪些字符敏感。
⑩ json中含有特殊字符串如何处理
1. 回车问题
JSON传值的时候,如果有回车符就会挂的。我们可以使用正回则来去掉答回车符:
1 $str = preg_replace("'([\r\n])[\s]+'", "", $str);
2
3 // 不用正则
4 $str = str_replace("\n","",$str);
转出来的字符串就没有回车符的困扰了。
顺便记录一个PHP过滤脚本:
01 <?php
02 // $document 应包含一个 HTML 文档。
03 // 本例将去掉 HTML 标记,javascript 代码
04 // 和空白字符。还会将一些通用的
05 // HTML 实体转换成相应的文本。