使用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 】
相关推荐:
Laravel Session怎么存储_Laravel Session驱动配置详解
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
企业网站制作这些问题要关注
java ZXing生成二维码及条码实例分享
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Swift中switch语句区间和元组模式匹配
🚀拖拽式CMS建站能否实现高效与个性化并存?
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
如何基于PHP生成高效IDC网络公司建站源码?
高端云建站费用究竟需要多少预算?
浅析上传头像示例及其注意事项
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
如何快速辨别茅台真假?关键步骤解析
如何在万网开始建站?分步指南解析
千库网官网入口推荐 千库网设计创意平台入口
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
奇安信“盘古石”团队突破 iOS 26.1 提权
JavaScript如何实现路由_前端路由原理是什么
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Python高阶函数应用_函数作为参数说明【指导】
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
免费视频制作网站,更新又快又好的免费电影网站?
JavaScript如何实现错误处理_try...catch如何捕获异常?
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
如何用IIS7快速搭建并优化网站站点?
Laravel如何使用查询构建器?(Query Builder高级用法)
IOS倒计时设置UIButton标题title的抖动问题
Firefox Developer Edition开发者版本入口
如何在服务器上配置二级域名建站?
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
Android实现代码画虚线边框背景效果
Android利用动画实现背景逐渐变暗
如何打造高效商业网站?建站目的决定转化率
Python面向对象测试方法_mock解析【教程】
如何在腾讯云服务器快速搭建个人网站?
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
如何在建站之星网店版论坛获取技术支持?
黑客如何通过漏洞一步步攻陷网站服务器?
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
Python3.6正式版新特性预览
使用spring连接及操作mongodb3.0实例
网站建设要注意的标准 促进网站用户好感度!
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
高防服务器租用首荐平台,企业级优惠套餐快速部署
上一篇:nginx域名怎么用
上一篇:nginx域名怎么用

