使用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生成缩略图的类代码
Oct 02 PHP
Windows 下的 PHP-PEAR 安装方法
Nov 20 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
Jul 01 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
9个经典的PHP代码片段分享
Dec 18 PHP
Symfony数据校验方法实例分析
Jan 26 PHP
PHP生成随机密码方法汇总
Aug 27 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
Sep 01 PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
PHP通过GD库实现验证码功能示例
Feb 23 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 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/11/07 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
Javascript 遍历对象中的子对象
2009/07/03 Javascript
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
Ext 今日学习总结
2010/09/19 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
element-ui中按需引入的实现
2019/12/25 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
Python群发邮件实例代码
2014/01/03 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
python 阶乘累加和的实例
2019/02/01 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
使用python模拟高斯分布例子
2019/12/09 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
收集的7个CSS3代码生成工具
2010/04/17 HTML / CSS
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
北承题目(C++)
2012/05/16 面试题
DIY手工制作经营店创业计划书
2014/02/01 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
企业职业病防治方案
2014/05/29 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
Go语言并发编程 sync.Once
2021/10/16 Golang
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
Python turtle编写简单的球类小游戏
2022/03/31 Python
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python