PHP Utilisation de JsonSerializable dans un objet


Exemple

PHP 5.x 5.4

Lorsque vous créez des API REST, vous devrez peut-être réduire les informations d'un objet à transmettre à l'application cliente. À cette fin, cet exemple illustre l'utilisation de l'interface JsonSerialiazble .

Dans cet exemple, la classe User étend en fait un objet de modèle de base de données d'un ORM hypotétique.

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
        ];
    }
}

Ajoutez l'implémentation JsonSerializable à la classe en fournissant la méthode jsonSerialize() .

public function jsonSerialize()

Maintenant, dans votre contrôleur d'application ou votre script, en passant l'objet User à json_encode() vous obtiendrez le tableau jsonSerialize() méthode jsonSerialize() au lieu de l'intégralité de l'objet.

json_encode($User);

Reviendra:

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

exemple de propriétés

Cela réduira à la fois la quantité de données renvoyée par un noeud final RESTful et permettra d'exclure les propriétés d'objet d'une représentation json.


Utilisation de propriétés privées et protégées avec json_encode()

Pour éviter d'utiliser JsonSerializable, il est également possible d'utiliser des propriétés privées ou protégées pour masquer les informations de classe à partir de la sortie json_encode() . Il n'est alors pas nécessaire que la classe implémente \ JsonSerializable.

La fonction json_encode () encode uniquement les propriétés publiques d'une classe en 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));

Sortie:

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