使用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 Class 文章
Apr 04 PHP
php中explode与split的区别介绍
Oct 03 PHP
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
解析php5配置使用pdo
Jul 03 PHP
php输出xml必须header的解决方法
Oct 17 PHP
php之curl设置超时实例
Nov 03 PHP
PHP实现接收二进制流转换成图片的方法
Jan 10 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
Jan 13 PHP
微信小程序 消息推送php服务器验证实例详解
Mar 30 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
PHP如何使用JWT做Api接口身份认证的实现
Feb 03 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运行环境教程
2015/02/12 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
javascript基本语法分析说明
2008/06/15 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
vue系列之动态路由详解【原创】
2017/09/10 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
2017/09/11 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
vue axios整合使用全攻略
2018/05/24 Javascript
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
python装饰器常见使用方法分析
2019/06/26 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
安卓程序员求职信
2014/02/28 职场文书
成语的广告词
2014/03/19 职场文书
四风对照检查材料范文
2014/09/27 职场文书
人事主管岗位职责
2015/02/04 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
pandas进行数据输入和输出的方法详解
2022/03/23 Python
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏