最近在开发小程序的时候,发现从服务器返回的JSON数据有时候能解析,有时候解析不了。
1、前提描述
我们发现,如果直接从服务器端返回JSON字符串,小程序收到的就会是object对象。像这样:
这里直接返回的json字符串。
这里收到的是object。这可能是微信替我们转好了,不多说。
2、问题描述
突然一次,程序跑卡住了,不往下跑了。于是发现返回的data并不是object了,而是一个看似JSON的字符串。
这里的data 看起来就是一个JSON字符串。
然后尝试去
JSON.parse(data)
,解析失败。委曲求全,eval('(' + data + ')')
的方式去解析,发现是可以的。但这不是我想要的。继续找问题。
通过微信开发工具调试模式下Network看到返回的东西前面有两个小红点,鼠标放上去弹出
\ufeff
,搜索之,非法字符?
3、解决方法
从网上搜了下,如果用windows自带的文本编辑器编辑过文件,就会自动添加上BOM头,很难发现 ,找了一段代码,去掉BOM头。
PS : 服务器我用的php环境
代码链接 www.douban.com/note/332229277/
上传代码至服务器项目目录 , 运行发现原来是微信登录提供的代码带有BOM头。把代码中的 $auto
改为 1 , 就可以删除BOM头了。问题解决。
PHP代码附录
class CheckDom {
private $auto;
public function index(){
header('content-Type: text/html; charset=utf-8');
if(isset($_GET['dir'])){//设置文件目录,如果没有设置,则自动设置为当前文件所在目录
$basedir=$_GET['dir'];
}else{
$basedir='.';
}
$this->auto=0;/*设置为1标示检测BOM并去除,设置为0标示只进行BOM检测,不去除*/
echo'当前查找的目录为:'.$basedir.'当前的设置是:';
echo$this->auto?'检测文件BOM同时去除检测到BOM文件的BOM':'只检测文件BOM不执行去除BOM操作';
$this->checkdir($basedir);
}
function checkdir($basedir){
if($dh=opendir($basedir)){
while(($file=readdir($dh)) !==false){
if($file!='.'&&$file!='..'){
if(!is_dir($basedir.'/'.$file)){
echo'文件: '.$basedir.'/'.$file.$this->checkBOM($basedir.'/'.$file).'';
}else{
$dirname=$basedir.'/'.$file;
$this->checkdir($dirname);
}
}
}
closedir($dh);
}
}
function checkBOM($filename){
$contents=file_get_contents($filename);
$charset[1]=substr($contents,0,1);
$charset[2]=substr($contents,1,1);
$charset[3]=substr($contents,2,1);
if(ord($charset[1])==239&& ord($charset[2])==187&&ord($charset[3])==191){
if($this->auto==1){
$rest=substr($contents,3);
$this->rewrite($filename,$rest);
return(' 找到BOM并已自动去除');
}else{
return(' 找到BOM');
}
}else{
return(' 没有找到BOM');
}
}
function rewrite($filename,$data){
$filenum=fopen($filename,'w');
flock($filenum,LOCK_EX);
fwrite($filenum,$data);
fclose($filenum);
}
}
?>
网友评论