PHP中如何获取含对象数组属性的类实例的JSON表示?
这问题我之前踩过坑!核心原因很简单:json_encode()根本不知道你自定义的getJSONString()方法存在——它默认只会处理对象的公共属性,或者遵循PHP官方JsonSerializable接口规范的对象。给你两种实用的解决办法:
方法一:手动遍历处理数组中的对象
既然你的getJSONString()是自定义序列化逻辑,那可以在主类的方法里,手动把books数组里的每个Book对象都转成数组:
public function getJSONString(){ return [ 'id' => $this->id, 'name' => $this->name, 'books' => array_map(function($book) { // 遍历每个Book对象,调用它的getJSONString转成数组 return $book->getJSONString(); }, $this->books) ]; }
之后你只需要像之前一样调用:
print(json_encode($yourMainObject->getJSONString()));
这样books里的每个Book都会被正确序列化成包含id和title的数组。
方法二:实现
JsonSerializable接口(推荐) 这是PHP官方提供的标准序列化方式,更优雅也更易维护。你只需要让主类和Book类都实现JsonSerializable接口,并重写jsonSerialize()方法(其实就是把你原来的getJSONString()改个名字就行):
首先改造Book类:
class Book implements JsonSerializable { // 你的属性定义:private $id; private $title; 等等 public function jsonSerialize() { return [ 'id' => $this->id, 'title' => $this->title ]; } }
然后改造主类:
class YourMainClass implements JsonSerializable { // 你的属性定义:private $id; private $name; private $books; 等等 public function jsonSerialize() { return [ 'id' => $this->id, 'name' => $this->name, 'books' => $this->books // 因为Book已经实现了JsonSerializable,会自动被处理 ]; } }
现在你不需要再调用自定义的getJSONString()了,直接序列化对象就行:
print(json_encode($yourMainObject));
json_encode()会自动递归调用每个对象的jsonSerialize()方法,包括books数组里的所有Book对象,完美解决序列化问题。
内容的提问来源于stack exchange,提问作者David - ACA Group
相关产品推荐
相关产品推荐

