使用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中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
Server.HTMLEncode让代码在页面里显示为源代码
Dec 08 PHP
php实现图片缩放功能类
Dec 18 PHP
php有道翻译api调用方法实例
Dec 22 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
PHP使用ActiveMQ实例
Feb 05 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
PHP7 标准库修改
Mar 09 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投票程序源码
2007/03/11 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
PHP-FPM的配置与优化讲解
2019/03/15 PHP
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
python实现log日志的示例代码
2018/04/28 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
Pytorch转onnx、torchscript方式
2020/05/25 Python
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
代理商会议邀请函
2014/01/27 职场文书
情人节寄语大全
2014/04/11 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
Pandas自定义选项option设置
2021/07/25 Python
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python