为了账号安全,请及时绑定邮箱和手机立即绑定

json_decode一个json字符为什么还是字符

json_decode一个json字符为什么还是字符

拉丁的传说 2019-04-08 11:17:27
$json_data=file_get_contents('http://www.btc38.com/trade/getTradeList.php?coinname=XRP');$data=json_decode($json_data,true);var_dump($data);//为什么仍然输出字符串????ps:在jslint.com测试$json_data为valid
查看完整描述

2 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

BOM!
我直接echo从网页获取到的内容,然后传递给json_pp:
>>>phpa.php|json_pp
malformedJSONstring,neitherarray,object,number,stringoratom,atcharacteroffset0(before"\x{ef}\x{bb}\x{bf}{"...")at/usr/bin/core_perl/json_ppline44.
                            
查看完整回答
反对 回复 2019-04-08
?
阿晨1998

TA贡献2037条经验 获得超6个赞

$header=array(
"User-Agent:Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/31.0.1650.63Safari/537.36"
);
$curl=curl_init('http://www.btc38.com/trade/getTradeList.php?coinname=XRP');
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_HTTPHEADER,$header);
$res=curl_exec($curl);
curl_close($curl);
$arr=json_decode($res);
switch(json_last_error()){
caseJSON_ERROR_NONE:
echo'没有错误发生';
break;
caseJSON_ERROR_DEPTH:
echo'到达了最大堆栈深度';
break;
caseJSON_ERROR_STATE_MISMATCH:
echo'无效或异常的JSON';
break;
caseJSON_ERROR_CTRL_CHAR:
echo'控制字符错误,可能是编码不对';
break;
caseJSON_ERROR_SYNTAX:
echo'语法错误';
break;
caseJSON_ERROR_UTF8:
echo'异常的UTF-8字符,也许是因为不正确的编码。';
break;
default:
echo'未知错误';
break;
}
?>
确实挺奇怪的,运行如上代码,使用json_last_error()最终提示的是语法错误。根据错误关键词搜索到SO中的这个问题:json_decodereturnsJSON_ERROR_SYNTAXbutonlineformattersaystheJSONisOK情况比较类似。按照答案之一说的怀疑了一下编码问题,不过看了下是UTF-8,没有问题。
单纯的复制页面中的字符串的话是没有问题的(复制到页面和PHP中都没有问题)。这个不算是答案,算是帮助题主补充说明吧,我也还在努力的寻找答案中。
后记
感谢@依云的答案,让我明白了原来是可恶的BOM的问题,关于BOM的问题@依云的维基百科链接已经很详细了,我就不多说了,这里就说一下怎么去除吧。其实BOM就是在字符串的最开头增加了三个字符,我们把它去除掉就好了。在json_decode之前用substr去除就好了,例如:
$res=substr($res,3);
$arr=json_decode($res,true);
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信