使用PHP json_decode可能遇到的坑与解决方法

发布时间 - 2026-01-11 02:37:48    点击率:

前言

最近在做网站 的时候用到了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  # json  # decode  # 编码  # 失败  # JavaScript字符串转数字的5种方法及遇到的坑  # 基于js粘贴事件paste简单解析以及遇到的坑  # JavaScript代码编写中各种各样的坑和填坑方法  # JavaScript中使用typeof运算符需要注意的几个坑  # Javascript中构造函数要注意的一些坑  # JS大坑之19位数的Number型精度丢失问题详解  # JS面试题大坑之隐式类型转换实例代码  # 对象题目的一个坑 理解Javascript对象  # 弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】  # 第二个  # 的是  # 是一个  # 原始数据  # 我要  # 是在  # 来了  # 是因为  # 有个  # 却是  # 说了  # 不多  # 并对  # 在对  # 一个问题  # 这篇文章  # 谢谢大家  # 出在  # 最突出  # 某项 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 简单实现Android验证码  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  html如何与html链接_实现多个HTML页面互相链接【互相】  WordPress 子目录安装中正确处理脚本路径的完整指南  高端网站建设与定制开发一站式解决方案 中企动力  如何挑选高效建站主机与优质域名?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  在Oracle关闭情况下如何修改spfile的参数  如何在局域网内绑定自建网站域名?  Python数据仓库与ETL构建实战_Airflow调度流程详解  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  黑客入侵网站服务器的常见手法有哪些?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何在万网自助建站中设置域名及备案?  Laravel如何处理文件下载请求?(Response示例)  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  北京企业网站设计制作公司,北京铁路集团官方网站?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  java中使用zxing批量生成二维码立牌  如何在IIS中新建站点并配置端口与IP地址?  Laravel怎么使用Intervention Image库处理图片上传和缩放  如何在香港服务器上快速搭建免备案网站?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  网站建设保证美观性,需要考虑的几点问题!  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Swift中switch语句区间和元组模式匹配  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  常州企业网站制作公司,全国继续教育网怎么登录?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  北京网站制作公司哪家好一点,北京租房网站有哪些?  高防服务器租用指南:配置选择与快速部署攻略  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  零基础网站服务器架设实战:轻量应用与域名解析配置指南  教学论文网站制作软件有哪些,写论文用什么软件 ?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  EditPlus中的正则表达式实战(6)  如何用5美元大硬盘VPS安全高效搭建个人网站?  ,怎么在广州志愿者网站注册?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何彻底删除建站之星生成的Banner?  ,网页ppt怎么弄成自己的ppt?  智能起名网站制作软件有哪些,制作logo的软件?  三星网站视频制作教程下载,三星w23网页如何全屏?