PHP 8.0 中 json_encode() 和 json_decode() 存在四大坑:中文默认转义需加 JSON_UNESCAPED_UNICODE;json_decode 默认返回对象而非数组,需设第二个参数为 true 才支持数组语法;空值、BOM、编码错误等均返回 null 且不报错,须用 json_last_error() 判断;浮点数可能丢失精度,NaN/INF 无法编码。

PHP 8.0 中 json_encode() 和 json_decode() 看似简单,但配合使用转对象或数组时,几个关键坑容易导致数据丢失、访问报错或静默失败。
中文字符默认被转义,可读性差
PHP 默认会把中文转成 \u4f60\u597d 这类 Unicode 形式,即使字符串本身是 UTF-8 编码:
- 不加选项:
json_encode(['msg' => '你好'])→{"msg":"\u4f60\u597d"} - 加
JSON_UNESCAPED_UNICODE:输出{"msg":"你好"},前端更友好
json_decode 默认返回对象,不是数组
很多人直接 $data = json_decode($json); echo $data['name'];,结果报错——因为返回的是 stdClass 对象,必须用 -> 访问:
$obj = json_decode($json); echo $obj->name;- 想用数组语法?第二个参数设为
true:$arr = json_decode($json, true); echo $arr['name'];
空值、无效 JSON、BOM 都返回 null,且不报异常
json_decode() 在多种错误下统一返回 null,极易误判为“原始数据就是 null”:
- JSON 格式错误(如单引号、尾部逗号、换行符未转义)
- 输入含 BOM(常见于 Windows 编辑器保存的文件)
- 字符串非 UTF-8(如 GBK 编码的中文)
- 嵌套过深(PHP 8.0 默认深度上限仍是 512 层,超限也返回 null)
务必搭配检查:
$data = json_decode($json, true);
if (is_null($data) && json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('JSON 解析失败:' . json_last_error_msg());
}
浮点数精度与特殊值处理易出偏差
PHP 8.0 仍存在一些边缘行为需要注意:
- 小数如
1.0经json_encode后可能变成整数1,再json_decode就不再是 float 类型 -
NaN、INF、-INF无法被正确编码,json_encode()返回false -
null值在 JSON 中合法,但若原始数据中某字段本就是null,和“解析失败返回 null”无法靠值区分,需结合json_last_error()判断
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











