使用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 相关文章推荐
Breeze 文章管理系统 v1.0.0正式发布
Dec 14 PHP
php date与gmdate的获取日期的区别
Feb 08 PHP
探讨fckeditor在Php中的配置详解
Jun 08 PHP
基于php常用正则表达式的整理汇总
Jun 08 PHP
php解析json数据实例
Aug 19 PHP
php实现修改新闻时删除图片的方法
May 12 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
php自定义函数实现二维数组排序功能
Jul 20 PHP
PHP精确计算功能示例
Nov 29 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
PHP常用字符串函数小结(推荐)
Aug 05 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 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 Smarty date_format [格式化时间日期]
2010/03/15 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
React组件的三种写法总结
2017/01/12 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
python编程开发之日期操作实例分析
2015/11/13 Python
Python同步遍历多个列表的示例
2019/02/19 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
自荐信要包含哪些内容
2013/11/06 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
师德师风个人反思
2014/04/28 职场文书
我爱我家教学反思
2014/05/01 职场文书
班主任经验交流材料
2014/12/16 职场文书
面试通知短信
2015/04/20 职场文书
2015年副班长工作总结
2015/05/15 职场文书
学籍证明模板
2015/06/18 职场文书
庭外和解协议书
2016/03/23 职场文书
合作意向书范本
2019/04/17 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
pytorch中[..., 0]的用法说明
2021/05/20 Python
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis