在对象中使用 JsonSerializable

PHP 5.x >= 5.4

构建 REST API 时,可能需要减少要传递给客户端应用程序的对象的信息。为此,此示例说明了如何使用 JsonSerialiazble 接口。

在此示例中,类 User 实际上扩展了 hypotetical ORM 的 DB 模型对象。

class User extends Model implements JsonSerializable {
    public $id;
    public $name;
    public $surname;
    public $username;
    public $password;
    public $email;
    public $date_created;
    public $date_edit;
    public $role;
    public $status;

    public function jsonSerialize() {
        return [
            'name' => $this->name,
            'surname' => $this->surname,
            'username' => $this->username
        ];
    }
}

通过提供 jsonSerialize() 方法将 JsonSerializable 实现添加到类中。

public function jsonSerialize()

现在在你的应用程序控制器或脚本中,当将对象 User 传递给 json_encode() 时,你将获得 jsonSerialize() 方法的返回 json 编码数组,而不是整个对象。

json_encode($User);

将返回:

{"name":"John", "surname":"Doe", "username" : "TestJson"}

属性值示例

这将减少从 RESTful 端点返回的数据量,并允许从 json 表示中排除对象属性。

使用私有和受保护的属性与 json_encode()

为避免使用 JsonSerializable,还可以使用 private 或 protected 属性来隐藏 json_encode() 输出中的类信息。然后 Class 不需要实现\ JsonSerializable。

json_encode() 函数只会将类的公共属性编码为 JSON。

<?php

class User {
    // private properties only within this class
    private $id;
    private $date_created;
    private $date_edit;

    // properties used in extended classes
    protected $password;
    protected $email;
    protected $role;
    protected $status;

    // share these properties with the end user        
    public $name;
    public $surname;
    public $username;

    // jsonSerialize() not needed here
}        

$theUser = new User();

var_dump(json_encode($theUser));

输出:

string(44) "{"name":null,"surname":null,"username":null}"