使用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网页如何全屏?
上一篇:nginx域名怎么用
上一篇:nginx域名怎么用

