在php开发中会遇到和他人对接接口,对方使用json传输数据,使用json_decode()函数却无法将json数据转换为数组。
先看封装的代码
private function curlPost($url, $post_data = [])
{
$ch = curl_init() or die (curl_error());
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 360);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$response = curl_exec($ch);
$res = json_decode($response, true);
return $res;
}
这种对接post接口的封装方法一般是没有问题的,但是我们打印$res的时候,会发现只会返回NULL。而打印$response的时候,是可以返回json字符串的。我们来看打印结果比对。
echo '<pre>';
var_dump($response);
var_dump($res);
打印结果
换一种打印方式:
var_dump($response);
打印结果
将打印结果复制到json转换网站:JSON在线 | JSON解析格式化—SO JSON在线工具
却发现是可以转换的。
我尝试将两个结果进行比对。
$response = curl_exec($ch);
$json = '{"achievement":"76","p_score":89,"score":70}';
var_dump($json);
echo '<br/>';
var_dump($response);
比对结果:
会发现两个结果相差3个字符
出现这个问题的原因:
我们的代码可能使用过window自带的编辑器进行编辑,它在保存一个UTF-8编码的代码文件的时候,会在文件头插入三个不可见的字符,分别是:0xEF 0xBB 0xBF,即BOM。对于一般的文件来说,不会产生问题,但是php因为不会忽略BOM,所以在调用这个php代码文件的时候,这三个字符也会跟着出现。
解决的方法:
加上下面的代码即可
if(substr($response,0,3) == pack("CCC",0xEF,0xBB,0xBF)) { $response = substr($response, 3); }
private function curlPost($url, $post_data = array())
{
$ch = curl_init() or die (curl_error());
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 360);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$response = curl_exec($ch);
if(substr($response,0,3) == pack("CCC",0xEF,0xBB,0xBF)) {
$response = substr($response, 3);
}
$res = json_decode($response, true);
return $res;
}
最后就可以将json字符串转换为数组。