php 7.4 中 json_encode() 返回空字符串主因是输入含非 utf-8 中文、资源、不可序列化对象等非法类型,需检测编码、转 utf-8、过滤控制字符,并用 json_last_error() 排查,返回前务必校验是否为 false。

PHP 7.4 中 json_encode() 返回空字符串,多数情况是因传入数据包含无法被 JSON 编码的字符(尤其是中文在非 UTF-8 编码下),或数据结构中存在资源、不可序列化对象等非法类型。中文显示为 Unicode 转义(如 "\u4f60\u597d")本身是正常行为,但若整个结果为空字符串,则说明编码过程已失败。
检查输入数据的编码与合法性
JSON 编码要求所有字符串必须是 UTF-8 编码。如果中文来自数据库、文件或用户输入,且原始编码是 GBK、GB2312 或 ISO-8859-1,直接传给 json_encode() 会返回 false(开启错误报告后可见),而 echo json_encode(...) 会输出空字符串(因为 false 被转为 "")。
- 用
mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true)初步判断字符串编码 - 统一转为 UTF-8:
$str = mb_convert_encoding($str, 'UTF-8', 'AUTO');(AUTO支持 GBK/GB2312/BIG5 等常见中文编码) - 检查是否含控制字符(如
\x00、\x08等):preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $str)
验证数据结构是否可 JSON 序列化
json_encode() 对资源(resource)、闭包(Closure)、未实现 JsonSerializable 的对象、含循环引用的数组等,均会失败并返回 false。
- 用
json_last_error()和json_last_error_msg()查看具体错误,例如:json_encode($data); var_dump(json_last_error_msg()); // "Type is not supported" - 对对象,确保其实现了
JsonSerializable接口,或使用get_object_vars()提取公共属性再编码 - 避免直接 encode 资源句柄(如 MySQLi 结果集、文件句柄),应先转换为数组
启用 JSON_UNESCAPED_UNICODE 避免中文转义
默认情况下,json_encode() 会把非 ASCII 字符(包括中文)转成 \uXXXX 形式。这不是错误,只是显示方式。如需原生中文输出(如 API 返回可读性更强的 JSON),加标志即可:
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
注意:该选项不影响编码是否成功,只影响输出格式;它要求 PHP ≥ 5.4,PHP 7.4 完全支持。
安全兜底:始终检查返回值
不要直接 echo 或 return json_encode() 结果,先判断是否成功:
⚠️ 错误写法:echo json_encode($data); // 失败时输出空字符串,难以排查
✅ 正确写法:
$json = json_encode($data);<br>
if ($json === false) {<br>
trigger_error('JSON encode failed: ' . json_last_error_msg(), E_USER_WARNING);<br>
exit(json_encode(['error' => 'Invalid data']));<br>
}<br>
header('Content-Type: application/json; charset=utf-8');<br>
echo $json;php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











