Maison  >  Article  >  développement back-end  >  Solution au problème selon lequel php json_encode ne prend pas en charge les attributs privés des objets

Solution au problème selon lequel php json_encode ne prend pas en charge les attributs privés des objets

jacklove
jackloveoriginal
2018-06-15 17:10:293315parcourir

Cet article présente la solution au problème selon lequel php json_encode ne prend pas en charge les propriétés privées des objets. json_encode peut convertir des objets au format json, et json_decode peut être utilisé pour les restaurer en objets.

Mais si l'objet contient des attributs privés, les attributs privés seront perdus après l'exécution de json_encode.

Exemple : json_encode perd l'attribut privé de l'objet

<?php// 用户类class user{
    public $id = 1;    public $name = &#39;fdipzone&#39;;    public $profession = &#39;programmer&#39;;    private $age = 18;
}// 对象$oUser = new User;// json_encode$json = json_encode($oUser);echo $json;// json_decode$oUser = json_decode($json);
var_dump($oUser);?>

Sortie :

{"id":1,"name":"fdipzone","profession":"programmer"}object(stdClass)[2]  public &#39;id&#39; => int 1
  public &#39;name&#39; => string &#39;fdipzone&#39; (length=8)  public &#39;profession&#39; => string &#39;programmer&#39; (length=10)

Après l'exécution de json_encode, l'âge de l'attribut privé est perdu.

Solution à la perte des propriétés privées des objets après json_encode

On peut modifier la classe pour implémenter la méthode d'interface de la classe abstraite JsonSeriallessly, spécifier les données qui doivent être sérialisé en JSON. Pour la méthode

JsonSeriallessly::jsonSerialize

, veuillez vous référer au site officiel : http://php.net/manual/zh/jsonserializing.jsonserialize.php

Après modification Le code est le suivant :

Sortie :
<?php// 用户类class user implements JsonSerializable{
    public $id = 1;    public $name = &#39;fdipzone&#39;;    public $profession = &#39;programmer&#39;;    private $age = 18;    // 实现的抽象类方法,指定需要被序列化JSON的数据
    public function jsonSerialize() {
        $data = [];        foreach ($this as $key=>$val){            if ($val !== null) $data[$key] = $val;
        }        return $data;
    }
}// 对象$oUser = new User;// json_encode$json = json_encode($oUser);echo $json;// json_decode$oUser = json_decode($json);
var_dump($oUser);?>

Après avoir spécifié les données qui doivent être sérialisées en JSON, json_encode peut lire le âge de l’attribut privé.
{"id":1,"name":"fdipzone","profession":"programmer","age":18}object(stdClass)[2]  public &#39;id&#39; => int 1
  public &#39;name&#39; => string &#39;fdipzone&#39; (length=8)  public &#39;profession&#39; => string &#39;programmer&#39; (length=10)  public &#39;age&#39; => int 18

Cet article présente la solution au problème selon lequel php

json_encode

ne prend pas en charge les propriétés privées des objets json_encode peut convertir des objets au format json, et json_decode peut être utilisé pour les restaurer en objets. . Mais si l'objet contient des attributs privés,

les attributs privés seront perdus

après l'exécution de json_encode. Exemple : json_encode perd l'attribut privé de l'objet

Sortie :
<?php// 用户类class user{
    public $id = 1;    public $name = &#39;fdipzone&#39;;    public $profession = &#39;programmer&#39;;    private $age = 18;
}// 对象$oUser = new User;// json_encode$json = json_encode($oUser);echo $json;// json_decode$oUser = json_decode($json);
var_dump($oUser);?>

Après l'exécution de json_encode, l'âge de l'attribut privé est perdu.
{"id":1,"name":"fdipzone","profession":"programmer"}object(stdClass)[2]  public &#39;id&#39; => int 1
  public &#39;name&#39; => string &#39;fdipzone&#39; (length=8)  public &#39;profession&#39; => string &#39;programmer&#39; (length=10)

Solution à la perte des propriétés privées des objets après json_encode

On peut modifier la classe pour implémenter la méthode d'interface de la classe abstraite

JsonSeriallessly

, spécifier les données qui doivent être sérialisé en JSON. Pour la méthode JsonSeriallessly::jsonSerialize, veuillez vous référer au site officiel : http://php.net/manual/zh/jsonserializing.jsonserialize.php

Après modification Le code est le suivant :

Sortie :

<?php// 用户类class user implements JsonSerializable{
    public $id = 1;    public $name = &#39;fdipzone&#39;;    public $profession = &#39;programmer&#39;;    private $age = 18;    // 实现的抽象类方法,指定需要被序列化JSON的数据
    public function jsonSerialize() {
        $data = [];        foreach ($this as $key=>$val){            if ($val !== null) $data[$key] = $val;
        }        return $data;
    }
}// 对象$oUser = new User;// json_encode$json = json_encode($oUser);echo $json;// json_decode$oUser = json_decode($json);
var_dump($oUser);?>
Après avoir spécifié les données qui doivent être sérialisées en JSON, json_encode peut lire le âge de l’attribut privé.

Cet article explique la solution au problème selon lequel php json_encode ne prend pas en charge les attributs privés des objets. Pour plus de contenu connexe, veuillez faire attention au site Web chinois de php.
{"id":1,"name":"fdipzone","profession":"programmer","age":18}object(stdClass)[2]  public &#39;id&#39; => int 1
  public &#39;name&#39; => string &#39;fdipzone&#39; (length=8)  public &#39;profession&#39; => string &#39;programmer&#39; (length=10)  public &#39;age&#39; => int 18

Recommandations associées :

Types de données de base js et opérateurs de conversion

Utilisation de with en JavaScript

Imbrication js et php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn