json_encode()返回null表示编码失败,常见原因包括资源类型、循环引用或非UTF-8编码;应配合json_last_error_msg()排查,并预处理数据。

json_encode() 编码失败返回 null 怎么办
PHP 中 json_encode() 返回 null 不代表“没结果”,而是明确表示编码失败。最常见原因是传入了无法序列化的数据类型,比如资源句柄(resource)、闭包(Closure)、或包含循环引用的数组/对象。
- 用
json_last_error()和json_last_error_msg()立刻检查错误原因,不要只看返回值是否为null - 对不确定结构的数据,先用
is_array()或is_object()过滤,再用array_walk_recursive()预处理掉resource或NULL值(如替换成''或'[resource]') - 若含中文,确保输入字符串是 UTF-8 编码;非 UTF-8 字符串(如 GBK)会直接导致
json_encode()失败
json_decode() 解析后是 object 还是 array
json_decode() 默认返回 stdClass 对象,不是关联数组。这点容易在遍历时出错——比如用 foreach ($data as $k => $v) 时,若误以为是数组却拿到对象,会触发 “Cannot use object as array” 错误。
- 加第二个参数
true:写成json_decode($json, true),强制返回关联数组 - 不加参数时,访问字段必须用
->(如$obj->name),不能用['name'] - 混合结构下(如 JSON 里既有对象又有数组),统一用
true更易处理,避免类型混用引发 Notice
PHP 7.3+ 的 JSON_THROW_ON_ERROR 选项怎么用
老版本 PHP 需要手动调用 json_last_error() 判断,代码冗长。PHP 7.3 起支持 JSON_THROW_ON_ERROR 标志,让 json_encode() 和 json_decode() 在失败时直接抛出 JsonException 异常。
try {
$arr = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
error_log('JSON 解析失败: ' . $e->getMessage());
$arr = [];
}
- 该标志必须和其他选项用按位或(
|)组合,不能单独传 - 仅在 PHP ≥ 7.3 有效;低于此版本会静默忽略该标志,退化为默认行为
- 异常类型是
JsonException,不是Exception,捕获时需写全名或 use 声明
处理大 JSON 文件时内存爆掉怎么办
用 file_get_contents() + json_decode() 一次性加载整个文件,遇到几十 MB 的 JSON 就容易 OOM。这不是 JSON 函数的问题,而是加载方式不合理。
立即学习“PHP免费学习笔记(深入)”;
- 小文件(json_decode(file_get_contents($file)),简单直接
- 中等文件(1–10MB):改用
stream_get_contents()配合fopen()分块读取,但注意 JSON 必须是单层结构(如纯数组),否则无法安全切分 - 真正的大文件(>10MB)或流式场景:换用基于 SAX 的解析器,如
jsond扩展(需编译安装)或纯 PHP 的JsonStreamingParser库,逐行/逐事件解析,内存占用恒定
json_encode(),既不报错也不警告,只默默返回 null;而开发者往往只检查空值,没查 json_last_error_msg(),最终卡在“为什么 JSON 没生成出来”。











