在对象中使用 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}"