使用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 相关文章推荐
基于PHPExcel的常用方法总结
Jun 13 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
再Docker中架设完整的WordPress站点全攻略
Jul 29 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
简单实现php上传文件功能
Sep 21 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
利用PHP扩展Xhprof分析项目性能实践教程
Sep 05 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 PHP
laravel实现上传图片的两种方式小结
Oct 12 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 PHP
PHP操作Redis常用命令的实例详解
Dec 23 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生成缩略图的函数代码(修改版)
2011/01/18 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
JavaScript字符集编码与解码详谈
2017/02/02 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
Python中unittest用法实例
2014/09/25 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
Python列表如何更新值
2020/05/27 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
python集合能干吗
2020/07/19 Python
Python通过字典映射函数实现switch
2020/11/06 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
90后毕业生的求职信范文
2013/09/21 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
班长演讲稿范文
2014/04/24 职场文书
应聘教师求职信范文
2015/03/20 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
初中毕业生感言
2015/07/31 职场文书
同事欢送会致辞
2015/07/31 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python