使用PHP json_decode可能遇到的坑与解决方法


Posted in PHP onAugust 03, 2017

前言

最近在做网站 的时候用到了json_decode函数,发现了一个问题,现在总结分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧。

场景:

某项目客户反馈,输出的结果 JSON 中有个要求为对象的数据字段,在某些情况下返回的是 [] 而不是 {};数据由公司其他部门提供,查看原始数据的时候,没有发现任何问题;后来因为要加入某些预处理,在获取到其他部门的 JSON 数据之后进行解码并对某个字段进行处理;然而,在处理完之后再次使用 JSON 输出,发现结果已经不是我们想要的了。

原始数据

{
 ...,
 "foo": "",
 "bar": {},
 ...
}

其中 foo 是我要进行处理的字段,处理完成之后再次使用 json_encode($data) 进行 JSON 编码。

编码完成之后的结果却是这样的

{
 ...,
 "foo": "",
 "bar": [],
 ...
}

空对象编程了空数组,而且我并没有处理过字段 bar

通过对模拟数据的实测,发现是因为在对 JSON 进行解码的时候,是这么解的

$data = json_decode($jsonString, true)

问题就出在这里,由于 PHP 自身的特性,在 PHP 中 array 是可以代表强类型语言,如 Java 中的 List 和 Map 的。

来看 PHP 中 json_decode() 方法是如何定义的

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

来源 http://php.net/manual/zh/function.json-decode.php

当第二个参数 $assoc 为 true 时,返回的类型是 array,所以问题就来了,当 JSON 中空对象 {} 和 [] 空数组,使用这种方式解码出来的结果表现是一致的;即 array();当再次 json_encode() 编码的时候就出现了 {} 变 [] 了。

所以正确的做法是在解码 JSON 的时候 json_decode 不要传递第二个参数;让解码结果是一个对象,然后操作对象的属性,操作完成之后再次编码就不会出现偏差。

这种问题最突出在于强类型语言和弱类型语言的 API 对接上,由于项目的下家是使用 Java 语言,所以导致了 BUG

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP&MYSQL服务器配置说明
Oct 09 PHP
常用的php对象类型判断
Aug 27 PHP
并发下常见的加锁及锁的PHP具体实现代码
Oct 12 PHP
优化PHP程序的方法小结
Feb 23 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
PHP中require和include路径问题详解
Dec 25 PHP
php文件上传后端处理小技巧
May 22 PHP
smarty模板数学运算示例
Dec 11 PHP
PHP无限极分类函数的实现方法详解
Apr 15 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
Aug 30 PHP
Yii 2中的load()和save()示例详解
Aug 03 #PHP
Yii2使用表单上传文件的实例代码
Aug 03 #PHP
yii2学习教程之5种内置行为类详解
Aug 03 #PHP
PHP实现的简单在线计算器功能示例
Aug 02 #PHP
利用php操作memcache缓存的基础方法示例
Aug 02 #PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 #PHP
YII框架中使用memcache的方法详解
Aug 02 #PHP
You might like
php递归遍历删除文件的方法
2015/04/17 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
JS DOM 操作实现代码
2010/08/01 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
Python操作MySQL简单实现方法
2015/01/26 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Python处理CSV与List的转换方法
2018/04/19 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
Python使用Socket实现简单聊天程序
2020/02/28 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
python如何调用php文件中的函数详解
2020/12/29 Python
村委会主任先进事迹
2014/01/15 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript