使用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中防止直接访问或查看或下载config.php文件的方法
Jul 07 PHP
php使用ICQ网关发送手机短信
Oct 30 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
PHP实现的sqlite数据库连接类
Dec 12 PHP
PHP引用的调用方法分析
Apr 25 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
PHP实现网站访问量计数器
Oct 27 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
Apr 27 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
Jan 10 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 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 多个submit提交表单 处理方法
2009/07/07 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
js中运算符&& 和 || 的使用记录
2014/08/21 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
ES6对象操作实例详解
2020/05/23 Javascript
Python获取当前时间的方法
2014/01/14 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
python数据封装json格式数据
2018/03/04 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
python switch 实现多分支选择功能
2020/12/21 Python
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
银行介绍信范文
2014/01/10 职场文书
岗位职责风险点
2014/03/12 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript