使用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 相关文章推荐
多数据表共用一个页的新闻发布
Oct 09 PHP
基于mysql的论坛(3)
Oct 09 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
Jan 11 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
php去除字符串换行符示例分享
Feb 13 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
Mar 12 PHP
php根据生日计算年龄的方法
Jul 13 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
PHP树形结构tree类用法示例
Feb 01 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
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
php实例分享之二维数组排序
2014/05/15 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
jQuery 操作option的实现代码
2011/03/03 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
工程现场管理求职自荐信
2013/10/02 职场文书
红旗方阵解说词
2014/02/12 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
预备党员群众意见
2015/06/01 职场文书
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android