使用json_encode()写入json文件需确保utf-8编码、添加json_unescaped_unicode标志、检查返回值是否为false,并用file_put_contents()保存;常见失败原因包括目录不存在、权限不足、磁盘空间满、open_basedir限制及含不可序列化数据。

直接用 file_put_contents() 配合 json_encode() 就能完成,但要注意编码、错误处理和中文乱码问题。
为什么 json_encode() 后写入文件会乱码或报错
PHP 默认输出 UTF-8,但若数组含中文且未声明 UTF-8 编码,json_encode() 会返回 null(PHP 7.4+)或转义成 Unicode(如 \u4f60\u597d),导致文件内容不可读。
- 确保源数组字符串是 UTF-8 编码(如从数据库或 POST 获取时已设好字符集)
- 调用
json_encode()时必须加JSON_UNESCAPED_UNICODE标志,否则中文被转义 - 检查
json_encode()返回值是否为false,避免写入空内容
保存数组到 JSON 文件的最小可靠写法
不依赖框架、不封装函数,三行解决:
$data = ['name' => '张三', 'score' => 95];
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if ($json === false) {
throw new Exception('JSON 编码失败:' . json_last_error_msg());
}
file_put_contents('data.json', $json . PHP_EOL);
-
JSON_UNESCAPED_SLASHES避免 URL 中的/被转义,提升可读性 -
PHP_EOL添加换行,方便命令行查看或后续追加(但注意:JSON 文件本身不应有多余换行) - 写入前建议用
is_writable()检查目录权限,尤其在 Linux 服务器上
写入失败的常见原因和排查点
即使代码看起来没问题,file_put_contents() 也可能静默失败——它只在权限不足或磁盘满时返回 false,但不会抛异常。
立即学习“PHP免费学习笔记(深入)”;
- 目标路径不存在?先用
dirname('path/to/data.json')+mkdir(..., 0755, true)确保目录存在 - PHP 进程用户无写权限?Linux 下检查
ls -ld /path/to/,Windows 下确认 IIS/Apache 用户有修改权 - 磁盘空间不足或 inodes 耗尽?
disk_free_space()和disk_total_space()可辅助判断 - open_basedir 限制?查看
phpinfo()或ini_get('open_basedir'),确保路径在允许范围内
最易忽略的是:数组里混入了不能 JSON 序列化的值,比如资源句柄(mysqli 对象)、Closure、或循环引用。这类情况 json_encode() 直接返回 false,但错误信息很模糊——务必用 json_last_error_msg() 看具体提示。











