You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:42:44