PHP 的 JSON 数据处理最佳实践:json_encode 深度限制、异常处理与性能优化

浅瑶君_8659

浅瑶君_8659

2026-05-19

925人浏览

原创

json_encode() 静默返回 false 而非抛异常,需用 === false 和 json_last_error_msg() 检测;json_decode() 的 $depth 是安全硬边界,设 64 更合理;中文乱码、空数组转对象、大整数丢失须分别用 json_unescaped_unicode、手动转 (object)[]、json_bigint_as_string 解决。

php 的 json 数据处理最佳实践:json_encode 深度限制、异常处理与性能优化

json_encode 会因循环引用或深度超限直接返回 false,不抛异常

PHP 的 json_encode() 在遇到无法序列化的结构(如资源类型、含循环引用的对象、或嵌套层级超过默认限制)时,不会报错或抛出异常,而是静默返回 false。这极易导致后续逻辑误判为“空数据”而非“编码失败”。

  • 默认最大深度是 512 层,但实际触发失败往往远低于此——尤其当对象属性间存在隐式引用(如 Doctrine Entity 中的关联关系)
  • 没有内置参数可让 json_encode() 在超限时抛出 Exception,必须手动检查返回值
  • 检测方式只能是:if ($json === false) { echo json_last_error_msg(); },不能用 === null 或 empty()
  • 若需控制深度,得先用递归函数预检结构深度,或改用 serialize() + 自定义 JSON 封装(不推荐,仅调试用)

json_decode 的 $depth 参数不是“建议值”,而是安全硬边界

很多开发者把 $depth 当作性能提示,其实它是防止栈溢出和 DoS 攻击的关键闸门。PHP 8.3+ 虽支持 json_validate() 预检,但不校验深度;真正起作用的只有 json_decode() 执行时的深度截断。

Browser Js
Browser Js

轻量级CDP浏览器控制,适用于AI代理。相较于内置浏览器工具,token消耗降低3‑10倍,仅在浏览时使用。

下载
  • 设为 64 足够覆盖绝大多数业务场景(如三层嵌套的订单+商品+规格),比默认 512 更安全
  • 设为 1 会直接拒绝所有对象/数组,只允许基本类型(string/number/bool/null),可用于白名单式轻量解析
  • 当 json_decode($str, true, $depth) 返回 null 且 json_last_error() === JSON_ERROR_DEPTH,说明不是格式错,而是结构太深
  • 不要依赖 set_error_handler() 捕获警告——json_decode() 不触发 E_WARNING,错误只存于内部状态

中文乱码、空数组转对象、大整数丢失:三个高频陷阱的绕过方式

这些不是 bug,而是 RFC 7159 与 PHP 类型系统的天然摩擦点,每个都对应一个明确的选项或前置动作。

  • 中文显示为 \u4f60\u597d:必须加 JSON_UNESCAPED_UNICODE,没别的办法;mb_convert_encoding() 只解决输入编码问题,不解决输出转义
  • 空数组 [] 被前端当成数组而非对象:PHP 没有 JSON_FORCE_OBJECT 这种选项,得手动转换 —— $data = empty($data) ? (object)[] : $data; 再传给 json_encode()
  • 19 位以上整数变科学计数法或精度丢失:加 JSON_BIGINT_AS_STRING,否则 json_decode() 会把它转成 float 导致末尾数字归零(如 "1234567890123456789" → 1.2345678901235E+18)

生产环境别用 JSON_PRETTY_PRINT,日志里也得关

缩进看似友好,但 JSON_PRETTY_PRINT 带来的空格和换行在 HTTP 响应头、Redis 缓存、数据库字段中全是冗余字节,且不可逆压缩。

  • API 响应体增加约 20–35% 体积,对移动端或高并发接口是实打实的带宽浪费
  • 写入 Redis 时若带缩进,相同数据的 strlen() 不同,导致缓存键不一致或误判变更
  • 日志中开启美化会导致单行日志跨多行,破坏 tail -f 和 ELK 解析;真要调试,用 var_dump(json_decode($json, true)) 更直接
  • 唯一合理使用场景:本地开发时 echo '<pre class="brush:php;toolbar:false;">' . htmlspecialchars(json_encode($data, JSON_PRETTY_PRINT)) . '</pre>';
关键点在于:PHP 的 JSON 函数设计上就是“静默失败 + 状态查询”模型,不是“异常驱动”。所有容错、性能、安全动作,都得靠你主动插在 json_encode() 和 json_decode() 前后,而不是指望它们自己扛。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

php js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10264

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6061

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2095

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3808

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4514

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3531

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5037

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3962

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11922

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习