PHP对象JSON编码返回空对象但无报错问题求助
问题分析与解决方案
你遇到的问题很典型:json_encode()默认只会序列化类的公共(public)属性,而你的User类里的属性都是私有(private)的,所以序列化后得到空对象{}。虽然json_last_error_msg()返回"No error",这是因为语法上没有错误,只是没有可序列化的公共属性而已,属于预期行为。
下面给你几种可行的解决方案,按推荐程度排序:
1. 实现JsonSerializable接口(推荐)
这是PHP中处理自定义类序列化最优雅的方式,既能保持类的封装性(属性私有),又能精确控制哪些数据被序列化。
修改你的User类,实现JsonSerializable接口并定义jsonSerialize()方法:
namespace php; class User implements \JsonSerializable { private $isAdmin = false; private $registerDate; private $sub; // 对应你输出的payload["sub"]值 // 你的其他类方法... public function jsonSerialize() { // 返回你想要序列化的属性数组,可按需筛选字段 return [ 'isAdmin' => $this->isAdmin, 'registerDate' => $this->registerDate, 'sub' => $this->sub ]; } }
之后再调用json_encode($user),就能得到包含你指定属性的JSON字符串了。
2. 将属性改为公共(public)
如果不需要严格的封装,这是最简单的方法,直接把private改成public:
namespace php; class User { public $isAdmin = false; public $registerDate; public $sub; // 你的其他类方法... }
这样json_encode()就能直接序列化这些公共属性了,但缺点是破坏了类的封装性,外部代码可以直接修改这些属性。
3. 使用反射获取私有属性(无需修改类结构)
如果不能修改User类的代码,可以用PHP的反射机制来读取私有属性,手动构建数组后再序列化:
$user = new \php\User(); $reflection = new \ReflectionClass($user); $properties = $reflection->getProperties(\ReflectionProperty::IS_PRIVATE); $data = []; foreach ($properties as $prop) { $prop->setAccessible(true); // 临时允许访问私有属性 $data[$prop->getName()] = $prop->getValue($user); } echo json_encode($data); // 现在能正确输出包含私有属性的JSON
这种方式适合临时解决问题,但代码相对繁琐,不如实现接口优雅。
内容的提问来源于stack exchange,提问作者Lars Dormans
相关产品推荐
相关产品推荐

