使用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 】
相关推荐:
佛山网站制作系统,佛山企业变更地址网上办理步骤?
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何用狗爹虚拟主机快速搭建网站?
如何彻底卸载建站之星软件?
C++时间戳转换成日期时间的步骤和示例代码
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
Laravel如何处理异常和错误?(Handler示例)
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
微信小程序 配置文件详细介绍
香港服务器租用每月最低只需15元?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
晋江文学城电脑版官网 晋江文学城网页版直接进入
详解MySQL数据库的安装与密码配置
SQL查询语句优化的实用方法总结
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
如何在阿里云服务器自主搭建网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
北京网站制作的公司有哪些,北京白云观官方网站?
怎样使用JSON进行数据交换_它有什么限制
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
香港服务器部署网站为何提示未备案?
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel如何生成API文档?(Swagger/OpenAPI教程)
做企业网站制作流程,企业网站制作基本流程有哪些?
制作旅游网站html,怎样注册旅游网站?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel怎么上传文件_Laravel图片上传及存储配置
中山网站推广排名,中山信息港登录入口?
如何在宝塔面板创建新站点?
如何快速上传自定义模板至建站之星?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
iOS UIView常见属性方法小结
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
想要更高端的建设网站,这些原则一定要坚持!
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
如何快速建站并高效导出源代码?
Thinkphp 中 distinct 的用法解析
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
nodejs redis 发布订阅机制封装实现方法及实例代码
如何在搬瓦工VPS快速搭建网站?
上一篇:nginx域名怎么用
上一篇:nginx域名怎么用

