PHP对象转JSON需用json_encode(),仅序列化public属性;含private/protected属性时应实现JsonSerializable接口;处理中文须加JSON_UNESCAPED_UNICODE选项;需规避循环引用、资源类型及DateTime等特殊对象,配合json_last_error()排错。

PHP对象转JSON,用 json_encode() 函数就行,但要注意对象属性的可见性、循环引用和特殊类型处理。
确保属性可访问
默认情况下,json_encode() 只能序列化 public 属性。private 和 protected 属性不会出现在 JSON 中。
如果需要控制输出内容,可以给类实现 JsonSerializable 接口:
class User implements JsonSerializable {
private $id = 1;
private $name = '张三';
public $email = 'zhang@example.com';
public function jsonSerialize() {
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email
];
}
}
$user = new User();
echo json_encode($user); // {"id":1,"name":"张三","email":"zhang@example.com"}
处理中文乱码和错误
PHP 7.1+ 默认支持 UTF-8,但若出现中文显示为 Unicode(如 "\u5f20\u4e09"),可加 JSON_UNESCAPED_UNICODE 选项:
立即学习“PHP免费学习笔记(深入)”;
-
json_encode($obj, JSON_UNESCAPED_UNICODE)—— 显示原始中文 -
json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)—— 格式化+中文 - 转换失败时,用
json_last_error()检查错误,常见原因是对象含资源(resource)、闭包或循环引用
避免循环引用崩溃
如果对象之间互相持有引用(比如父对象含子对象,子对象又存了父对象),json_encode() 会报错或返回 false。
解决方法:
- 在
jsonSerialize()中只返回必要字段,不传递双向引用 - 提前 unset 可能引发循环的属性
- 用 try-catch 捕获异常并提示(PHP 7.3+ 支持
JSON_THROW_ON_ERROR)
日期和对象嵌套的处理
DateTime 对象默认转成空对象 {},需手动格式化:
public function jsonSerialize() {
return [
'created_at' => $this->created_at->format('Y-m-d H:i:s'),
'status' => $this->status
];
}
嵌套对象同理:确保每个子对象也实现了 JsonSerializable 或只输出其 public 属性。



















