使用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 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
php数组总结篇(一)
Sep 30 PHP
PHP四舍五入精确小数位及取整
Jan 14 PHP
linux使用crontab实现PHP执行计划定时任务
May 10 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
PHP应用跨时区功能的实现方法
Mar 21 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 PHP
Laravel使用RabbitMQ的方法示例
Jun 18 PHP
laravel实现上传图片的两种方式小结
Oct 12 PHP
php桥接模式应用案例分析
Oct 23 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
Aug 26 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
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
2007/03/06 PHP
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
PHP多态代码实例
2015/06/26 PHP
php文件系统处理方法小结
2016/05/23 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
php接口隔离原则实例分析
2019/11/11 PHP
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
基于js中style.width与offsetWidth的区别(详解)
2017/11/12 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
Python re模块介绍
2014/11/30 Python
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
介绍一下gcc特性
2015/10/31 面试题
毕业生求职的求职信
2013/12/05 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis