首頁  >  文章  >  後端開發  >  php json_encode不支援物件私有屬性的解決方法

php json_encode不支援物件私有屬性的解決方法

jacklove
jacklove原創
2018-06-15 17:10:293305瀏覽

本文介紹php json_encode不支援物件私有屬性的解決方法,json_encode可以把物件轉換為json格式,使用json_decode可以還原為物件。

但如果物件內含有私有屬性,執行json_encode後,私有屬性會遺失

範例:json_encode遺失物件私有屬性

<?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);?>

輸出:

{"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)

執行json_encode後,私有屬性age遺失了。

json_encode後物件的私有屬性遺失解決方法

我們可以修改類,使其實作JsonSerializable抽象類別的介面方法jsonSerialize,指定需要被序列化成JSON的資料。

關於JsonSerializable::jsonSerialize方法可參考官網:http://php.net/manual/zh/jsonserializable.jsonserialize.php

#修改後程式碼如下:

<?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);?>

輸出:

{"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

在指定了需要被序列化成JSON的資料後,json_encode可以讀取到私有屬性age。

本文介紹php json_encode不支援物件私有屬性的解決方法,json_encode可以把物件轉換為json格式,使用json_decode可以還原為物件。

但如果物件內含有私有屬性,執行json_encode後,私有屬性會遺失

範例:json_encode遺失物件私有屬性

<?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);?>

輸出:

{"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)

執行json_encode後,私有屬性age遺失了。

json_encode後物件的私有屬性遺失解決方法

我們可以修改類,使其實作JsonSerializable抽象類別的介面方法jsonSerialize,指定需要被序列化成JSON的資料。

關於JsonSerializable::jsonSerialize方法可參考官網:http://php.net/manual/zh/jsonserializable.jsonserialize.php

#修改後程式碼如下:

<?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);?>

輸出:

{"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

在指定了需要被序列化成JSON的資料後,json_encode可以讀取到私有屬性age。

本文說明了php json_encode不支援物件私有屬性的解決方法 ,更多相關內容請關注php中文網。

相關推薦:

js 基礎資料型別及轉換進位運算子

JavaScript中with的用法

js與php巢狀

##

以上是php json_encode不支援物件私有屬性的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn