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

这篇具有很好参考价值的文章主要介绍了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);

打印结果

PHP解析带BOM头的JSON数据,对接他人接口的时候,使用json_decode(),返回null的问题与解决方法,PHP常见问题,php,json,开发语言
打印结果

 

换一种打印方式:

var_dump($response);

打印结果

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

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

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

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

却发现是可以转换的。

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

$response = curl_exec($ch);
$json = '{"achievement":"76","p_score":89,"score":70}';
var_dump($json);
echo '<br/>';
var_dump($response);

比对结果:

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

会发现两个结果相差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字符串转换为数组。文章来源地址https://www.toymoban.com/news/detail-741697.html

到了这里,关于PHP解析带BOM头的JSON数据,对接他人接口的时候,使用json_decode(),返回null的问题与解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果

    uintt16位的话会在上面前面加上00,16位的话一定是两个字节,一共16位的数据 如果是unint8的话就不会, 注意这里给的是13,但是现实的00 0D,这是大小端的问题,在matlanb里设置,我们就默认用这个模式吧,没关系的,小端,小段的小数据在前,所以是00 0D。 下图是串口输出P

    2024年02月20日
    浏览(41)
  • AD21小技巧:导出BOM时候区分开顶层和底层元件

    AD21小技巧:导出BOM时候区分开顶层和底层元件 选中PCB Parameters ,找到layer选项,点击显示。 按住左键,将layer拖到上面一栏 如图片所示,顶层和底层元件就分开了。然后再按需要的bom格式导出就可以了。

    2024年02月11日
    浏览(37)
  • 测试接口,发起请求时候报错JSON parse error: Cannot deserialize instance of java.util.ArrayList<java.lang.Object>

    JSON parse error: Cannot deserialize instance of java.util.ArrayListjava.lang.Object out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.util.ArrayListjava.lang.Object out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 1] 参数字段不匹配

    2024年02月12日
    浏览(58)
  • dedecms织梦系统对接百度熊掌号并添加JSON_LD数据

    百度近期推出的百度熊掌号非常的不错,我的dedecms织梦系统早早就对接好了,它能对你的原创文章进行原创保护,并评出熊掌号搜索指数,熊掌号搜索指数是对你文章的内容质量,用户喜爱、原创能力、活跃表现、领域专注五个维度进行计算评估而得到的。 你的dedecms织梦网站开通

    2024年02月02日
    浏览(45)
  • 数据接口工程对接BI可视化大屏(一)

    此项目以常见的手机零售BI场景为例,介绍如何编写数据接口工程对接BI可视化大屏。 如何从当前常见的主流大数据场景中为后台程序推送数据及接收前台数据。 背景知识需要: 掌握Redis,MySQL,ClickHouse,HBase,Phoenix,Kafka,ElasticSearch相关软件的使用。 掌握SpringBoot,MyBatis等相

    2024年02月09日
    浏览(36)
  • 多语言对接电商平台api接口获取京东商品评论数据代码展示示例

    商品评论接口的意义: 确认消费者关注与产品卖点是否一致; 洞察用户对价格、促销、直播的敏感度;发现产品质量、客服、物流等方面的问题;找到品牌宣称与用户预期、实际场景之间差异化;挖掘消费者偏好的差异性,进行用户分群偏好研究;还原客户故事,分析其购

    2024年02月11日
    浏览(37)
  • 爬虫小白入门在服务器上-部署爬虫或者开服务接口并供给他人访问

    一、准备工作-服务器 1、先准备一个服务器(以阿里云为例子) 1、先准备一个云服务器,比如阿里云服务器新人免费使用3个月 , 或者腾讯云服务器,又或者华为云服务器都可以, 但是提醒注意下,新用户的首单资格优惠力度最大,所以最好在一年有活动的时候买,比如61

    2024年02月17日
    浏览(47)
  • DEDECMS JSON数据生成 DEDECMS JSON接口制作

    json数据格式可以方便不同站点之间进行数据调用引用,当然我们的DEDECMS也可以实现全站数据生成JSON供其他站点调用,代码很简单,主要用到include/json.class.php。 织梦本身是自带json标签的,调用方法: 这个标签调用例子在织梦手册里已经给我们提供了,url是一个远程json接口地址

    2024年02月02日
    浏览(27)
  • postman测试提交json数据到数据接口

    利用postman测试,采取post方式,提交json数据到服务器端接口,应该如下设置: 相应服务器端程序:

    2024年02月11日
    浏览(41)
  • Android 解析JSON数据

    第一种使用JSONObject解析JSON数据,这是Android中最基本的数据解析方式 第二种方式通过GSON去解析JSON数据  同样的数据格式 GSON的数据解析看起来代码量相对小一点,但所创建的类也是必须的 第一个支持的类,此类为自定义名字,为了方便随意起的,但在项目中要正规取名,见

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包