合法json需用json_decode()配合json_last_error()判断:先trim去空和bom,再解析并检查错误码是否为json_error_none,仅判null会误杀合法null值。
用 json_decode() 判断是否为合法 JSON 字符串
PHP 没有原生的“JSON 文件类型检测”函数,最可靠的方式是读取文件内容后尝试解析:如果 json_decode() 返回非 null 值(且没触发警告),说明内容是合法 JSON。注意必须传入第二个参数 true 或 false 显式控制返回数组或对象,否则空 JSON 对象 {} 解码后是空对象,但 json_last_error() 才是判断依据。
常见错误现象:json_decode(file_get_contents($file)) === null 不能直接断定非法 —— 因为 JSON 中的 null、空字符串、false 都会返回 null,必须配合 json_last_error() === JSON_ERROR_NONE 判断。
- 先用
file_get_contents($file)读取全部内容(确保文件不大,避免内存溢出) - 调用
json_decode($content, true),然后立即检查json_last_error() - 若
json_last_error() !== JSON_ERROR_NONE,说明不是合法 JSON 格式 - 额外建议:用
trim($content) === ''排除空文件干扰
检查文件扩展名和 MIME 类型不靠谱
仅靠 .json 后缀或 finfo_file() 返回 application/json 无法确认内容真实合法性。很多场景下用户可任意改后缀,或服务端未正确设置 MIME;finfo 实际依赖文件头部字节特征,而 JSON 是纯文本,无固定 magic bytes,容易误判为 text/plain。
使用场景:上传文件校验时,不能跳过内容解析只信后缀。曾遇到用户上传名为 data.json 的 CSV 内容,后缀+MIME 全对,但后续解析直接报错。
立即学习“PHP免费学习笔记(深入)”;