PHP解析带BOM头的JSON数据,对接他人接口的时候,使用json_decode(),返回null的问题与解决方法

在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 '
';
var_dump($response);
var_dump($res);

打印结果

PHP解析带BOM头的JSON数据,对接他人接口的时候,使用json_decode(),返回null的问题与解决方法_第1张图片 打印结果

 

换一种打印方式:

var_dump($response);

打印结果

将打印结果复制到json转换网站:JSON在线 | JSON解析格式化—SO JSON在线工具

PHP解析带BOM头的JSON数据,对接他人接口的时候,使用json_decode(),返回null的问题与解决方法_第2张图片

PHP解析带BOM头的JSON数据,对接他人接口的时候,使用json_decode(),返回null的问题与解决方法_第3张图片

却发现是可以转换的。

我尝试将两个结果进行比对。

$response = curl_exec($ch);
$json = '{"achievement":"76","p_score":89,"score":70}';
var_dump($json);
echo '
'; 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字符串转换为数组。

你可能感兴趣的:(PHP常见问题,php,json,开发语言)