json_encode()是PHP接口最直接稳妥的JSON序列化方式,需避免资源类型、处理UTF-8编码、预转换DateTime,并用api_response()封装确保一致性。

PHP接口里用json_encode()是最直接的序列化方式
绝大多数 HTTP 接口返回 JSON,json_encode() 就是 PHP 原生最稳妥的选择。它把数组或对象转成标准 JSON 字符串,浏览器、App、其他服务都能直接解析。
注意几个关键点:
- 确保数据里没有资源类型(比如
mysqli连接句柄、文件句柄),否则会报TypeError: json_encode(): Type is not supported - 中文默认会被转成 Unicode(如
"\u4f60\u597d"),加JSON_UNESCAPED_UNICODE参数可避免 - 如果数据含时间戳或
DateTime对象,需提前转成字符串,json_encode()不会自动格式化
示例:
$data = ['code' => 0, 'msg' => '成功', 'data' => ['name' => '张三', 'at' => date('Y-m-d H:i:s')]];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
遇到json_encode()返回false怎么办
这是接口出错最常见却容易被忽略的问题——返回空字符串或 null,前端收不到任何有效响应。
立即学习“PHP免费学习笔记(深入)”;
排查步骤:
- 调用后立刻检查
json_last_error()和json_last_error_msg(),比如JSON_ERROR_UTF8表示字符串含非法 UTF-8 字节(常见于从数据库或旧系统读出的 GBK 数据) - 用
mb_check_encoding($str, 'UTF-8')验证每个字符串字段 - 对不确定编码的字段,统一转码:
mb_convert_encoding($str, 'UTF-8', 'auto') - 避免递归引用:对象 A 持有 B,B 又持有 A,
json_encode()会直接失败,不是报错而是返回false
要不要用serialize()或igbinary_serialize()
不要在对外 HTTP 接口中用 serialize()。它生成的是 PHP 特有格式(如 a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}),其他语言基本无法解析,且存在反序列化漏洞风险。
igbinary_serialize() 同理,虽然更紧凑、更快,但仍是 PHP 生态私有协议,只适合 Redis 缓存等内部场景。
真正需要二进制高效传输时,应选通用协议:gRPC(Protocol Buffers)或 MessagePack(msgpack_pack()),但前提是客户端也支持——HTTP 接口默认就该坚持 JSON。
简单接口封装一个api_response()函数就够了
重复写 header + json_encode 容易漏参数或出错,抽成一个函数能省事又保一致。
示例(不依赖框架):
function api_response($data, $code = 0, $msg = 'ok') {
http_response_code(200);
header('Content-Type: application/json; charset=utf-8');
$out = ['code' => $code, 'msg' => $msg, 'data' => $data];
echo json_encode($out, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_SUBSTITUTE);
exit;
}
// 使用
api_response(['id' => 123, 'title' => '测试']);
这里加了 JSON_INVALID_UTF8_SUBSTITUTE,让非法 UTF-8 字节自动替换成 ,避免整个响应失败——比硬崩掉更利于调试。
真正难的不是序列化本身,而是数据源头是否干净:数据库连接编码、GET/POST 输入是否过滤、第三方 API 返回内容是否校验。这些地方一松懈,json_encode() 就会默默失败。



















