使用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 相关文章推荐
模拟SQLSERVER的两个函数:dateadd(),datediff()
Oct 09 PHP
PHP数据缓存技术
Feb 14 PHP
PHP 全角转半角实现代码
May 16 PHP
php中获取指定IP的物理地址的代码(正则表达式)
Jun 23 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
Session保存到数据库的php类分享
Oct 24 PHP
file_get_contents获取不到网页内容的解决方法
Mar 07 PHP
yii实现图片上传及缩略图生成的方法
Dec 04 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 PHP
Laravel第三方包报class not found的解决方法
Oct 13 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 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
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
php中使用GD库做验证码
2016/03/31 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
ext监听事件方法[初级篇]
2008/04/27 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
vue之延时刷新实例
2019/11/14 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
python中for用来遍历range函数的方法
2018/06/08 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
如何基于Python按行合并两个txt
2020/11/03 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
Final类有什么特点
2012/04/25 面试题
室内设计专业学生的自我评价分享
2013/11/27 职场文书
宣传活动总结范文
2014/07/01 职场文书
中学生爱国演讲稿
2014/09/05 职场文书
党员示范岗材料
2014/12/19 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
Python图像处理库PIL详细使用说明
2022/04/06 Python