Php 如何使用数组变量获取对象的JSON表示

Php 如何使用数组变量获取对象的JSON表示,php,arrays,json,Php,Arrays,Json,这个类有三个变量,其中一个是数组。我已经编写了一个在json_encode()中使用的方法 书籍是书籍对象的数组。每个Book对象也有相同的精确方法,但有自己的变量 public function getJSONString(){ return [ 'id' => $this->id, 'title' => $this->title ]; } 当我调用print(json_encode($author->getJSONSt

这个类有三个变量,其中一个是数组。我已经编写了一个在json_encode()中使用的方法

书籍是书籍对象的数组。每个Book对象也有相同的精确方法,但有自己的变量

public function getJSONString(){
    return [
        'id' => $this->id,
        'title' => $this->title
    ];
}
当我调用print(json_encode($author->getJSONString())时,我收到以下消息:

{"id":"1","name":"name1","books":[{},{}]}

你知道为什么书是空的吗?提前谢谢

您还需要使用
Book
s'
getJSONString()
方法。这将使
books
属性等于一个JSON可编码对象数组

在作者的
getJSONString()
方法中:

public function getJSONString(){
     return [
         'id' => $this->id,
         'name' => $this->name,
         'books' => array_map(function($book) { return $book->getJSONString(); }, $this->books)
     ];
}
我不是一个流利的PHP,但你可以从这个想法。它映射了一个函数,以通过
书籍
数组获取
getJSONString()

您一定要使用它


当您为此类对象或任何包含此类对象的对象调用
json\u encode
时,php将调用您的
jsonSerialize
方法。与您正在尝试做的类似,但这是特定于语言的正确方法。像C#这样的其他语言也有类似的接口。

可能
$this->books
是空的。检查它是否为空
var\u dump($this->books)
并检查设置其值的代码可能是调用
getJSONString()
后正在执行的书籍是空的,因为它们最初是空的
print\r()
您的变量,然后看。我想调用每本书的getJSONString,但我认为在这个示例中,它调用了错误的getJSONString方法。看看类书,它有自己的方法实现,现在我认为它一直在声明$books的同一个类中调用getJSONString?@Oops,我在第一个代码中犯了一个愚蠢的错误。我更改了它,以便它使用
$book->getJSONString()
。告诉我现在行不行,现在行了。非常感谢你的帮助@很高兴我帮了你!这不是一个好办法。使用
JsonSerializer
是更干净的方法。看看我的答案。
public function getJSONString(){
     return [
         'id' => $this->id,
         'name' => $this->name,
         'books' => array_map(function($book) { return $book->getJSONString(); }, $this->books)
     ];
}
class Book implements JsonSerializable 
{
    public function jsonSerialize() {
        return [
           'id' => $this->id,
           'title' => $this->title
        ];
    }
}