使用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中MVC模式的模板引擎开发经验分享
Mar 23 PHP
PHP定时执行计划任务的多种方法小结
Dec 19 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
如何修改和添加Apache的默认站点目录
Jul 05 PHP
php网站被挂木马后的修复方法总结
Nov 06 PHP
PHP字符串word末字符实现大小写互换的方法
Nov 10 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
PHP中filter函数校验数据的方法详解
Jul 31 PHP
PHP实现生成带背景的图形验证码功能
Oct 03 PHP
如何使用php等比例缩放图片
Oct 12 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
php使用curl下载指定大小的文件实例代码
Sep 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中数组合并的两种方法及区别介绍
2012/09/14 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
php图片缩放实现方法
2014/02/20 PHP
php中JSON的使用与转换
2015/01/14 PHP
javascript 对象的定义方法
2007/01/10 Javascript
node.js超时timeout详解
2014/11/26 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
Python中对列表排序实例
2015/01/04 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
python求质数列表的例子
2019/11/24 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
某公司.Net方向面试题
2014/04/24 面试题
公司授权委托书范本
2014/04/03 职场文书
安全宣传标语
2014/06/10 职场文书
品质口号大全
2014/06/17 职场文书
倡议书的写法
2014/08/30 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
离婚案件原告代理词
2015/05/23 职场文书