php写入json文件需三步:编码→检查→写入;关键避坑点为utf-8编码、非法类型(如资源/循环引用)、路径权限、并发覆盖及写后验证,须用json_encode配合json_unescaped_unicode等选项并检查返回值与错误码。

PHP写入JSON文件的基本流程
直接用 file_put_contents() 配合 json_encode() 就能完成,但关键在编码、格式和错误处理——不是所有数组都能无损转成 JSON,也不是所有路径都能随便写。
为什么 json_encode() 会返回 false
常见于含非 UTF-8 字符、资源类型(如 mysqli 对象)、循环引用、或不支持的类型(如 SimpleXMLElement 未显式转字符串)。调用后必须检查返回值:
if (false === $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)) {
error_log('JSON encode failed: ' . json_last_error_msg());
return false;
}
-
JSON_UNESCAPED_UNICODE避免中文被转成\uXXXX -
JSON_PRETTY_PRINT仅用于调试,生产环境建议去掉(减少体积、加快写入) - 如果数据来自数据库或用户输入,先用
mb_convert_encoding($data, 'UTF-8', 'auto')统一编码
file_put_contents() 的权限与路径陷阱
写入失败通常不是 JSON 问题,而是 PHP 进程没权限写目标目录,或路径不存在。不要假设相对路径“应该”能写:
- 用
dirname($filepath)+is_writable()提前判断目录是否可写 - 绝对路径更可靠:
/var/www/data/config.json比./data/config.json少歧义 - 写入时加
LOCK_EX参数防止并发覆盖:file_put_contents($path, $json, LOCK_EX) - 若目标文件被其他进程独占(如 Windows 下被编辑器打开),
file_put_contents()会静默失败,需配合is_writable($path)或@fopen($path, 'c')探测
写入后怎么确认 JSON 文件真正可用
写完不验证,等于没写。尤其当 $data 是动态生成时,很容易漏掉深层嵌套的非法值:
- 立即用
file_get_contents()读回并json_decode()测试解析是否成功 - 检查
json_last_error()是否为JSON_ERROR_NONE,而非依赖返回值是否null - 避免用
json_decode(file_get_contents($path)) === null判断——空数组解码后也是null,应结合json_last_error()
最易被忽略的是:JSON 写入成功 ≠ 文件内容可被其他程序安全读取。UTF-8 BOM、末尾换行、权限掩码(如 0600 导致 Web 服务器无法读)都会让下游出错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











