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 '<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字符串转换为数组。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值