最稳妥方式是直接调用json_encode()并设置content-type响应头;需确保对象属性可序列化、处理中文字符集、实现jsonserializable接口控制private/protected属性输出,避免拼接字符串或混用调试函数。

PHP 用 json_encode() 返回对象数据最稳妥
直接调用 json_encode() 是 PHP 返回 JSON 的标准方式,它能自动处理对象属性(包括 public、protected,但默认忽略 private 属性),无需手动遍历或转换。关键不是“怎么转”,而是“怎么让对象输出符合预期的 JSON 结构”。
常见错误是直接 echo $obj 或没设响应头,导致前端收到的是字符串或解析失败。
- 必须设置
Content-Type: application/json; charset=utf-8响应头,否则 jQuery/fetch 可能不识别为 JSON - 确保对象属性可被序列化:避免资源类型(如
mysqli实例)、闭包、循环引用 - 若对象含中文字符,确认文件保存为 UTF-8 无 BOM,且数据库连接已设好字符集(如
SET NAMES utf8mb4)
对象里有 private/protected 属性?用 JsonSerializable 接口控制输出
默认 json_encode() 不序列化 private 和 protected 属性,但你可以让类实现 JsonSerializable 接口,显式定义返回哪些字段。
class User implements JsonSerializable {
private $id;
private $name;
protected $email;
public function __construct($id, $name, $email) {
$this->id = $id;
$this->name = $name;
$this->email = $email;
}
public function jsonSerialize() {
return [
'user_id' => $this->id,
'full_name' => $this->name,
'contact_email' => $this->email
];
}
}
$user = new User(123, '张三', 'zhang@example.com');
header('Content-Type: application/json; charset=utf-8');
echo json_encode($user); // 输出:{"user_id":123,"full_name":"张三","contact_email":"zhang@example.com"}
遇到 Notice: Array to string conversion?检查是否误用了 echo 或拼接
这个错误通常不是 json_encode() 本身的问题,而是你试图把数组或对象当字符串用了,比如:
立即学习“PHP免费学习笔记(深入)”;
-
echo "data: " . json_encode($obj);→ 错!json_encode()返回字符串,但前面的字符串拼接可能触发隐式转换警告 -
return json_encode($obj) . "\n";→ 若在框架中返回,可能破坏 JSON 格式完整性 - 用了
print_r($obj)或var_dump($obj)而非json_encode()
正确做法是:单独输出,不拼接,不混用调试函数。
需要兼容老版本 PHP 或特殊格式?注意 JSON_UNESCAPED_UNICODE 和错误处理
PHP 5.4+ 支持 JSON_UNESCAPED_UNICODE,否则中文会被转成 \uXXXX;PHP 7.3+ 还支持 JSON_THROW_ON_ERROR 避免静默失败。
- 中文不乱码:加标志
json_encode($data, JSON_UNESCAPED_UNICODE) - 查错更直观:用
json_last_error()判断失败原因,比如JSON_ERROR_UTF8表示输入含非法 UTF-8 字节 - 空对象/数组输出为
{}或[],不是null—— 若需 null,得显式判断后赋值
最容易被忽略的是:对象里嵌套了 DateTime 实例、SimpleXML 对象或 PDOStatement,它们不能直接被 json_encode() 处理,必须提前转成字符串或数组。










