2016-12-29 111 views
0

我有一個類,它被序列化爲json和內置的json_encode。然而,當這個對象被編碼時,我想要對它的某些屬性進行不同的編碼。例如,在下面的代碼中,我希望使用小寫名稱對屬性進行編碼(即,值變爲值)。它可以自定義json_encode的方式,編碼我的對象?

class MyClassName 
{ 
    public $Value; 
    public $OtherValue; 
} 
+0

另一種方法可能是,當你收到JSON使用功能-ING呼應 –

+0

之前爲小寫對象的第一個字母有函數,作爲'strtolower',有一個選項可以在你的類中添加一個方法,比如'toArray',它可以按照你希望他們編碼的方式返回屬性,你只需要花費很少的精力來準備數據的方式,你需要它,而不是期望從簡單的功能奇蹟和頭腦閱讀。 –

+0

@ N.B。兩者之間的問題是我不想讓我的變量名小寫。所以我不能簡單地小寫變量。 – UnkwnTech

回答

3

閱讀(並在課堂上實施)JsonSerializable接口。

class MyClassName implements JsonSerializable 
{ 
    public $Value; 
    public $OtherValue; 

    public function jsonSerialize() 
    { 
     return array(
      'value' => $this->Value, 
      'otherValue' => $this->OtherValue, 
     ); 
    } 
} 

如果你的類實現了接口,json_encode()調用該方法jsonSerialize()時,它需要編碼類的一個實例。

該方法必須返回一個數組,該數組由json_encode()編碼,而不是生成它的實例。

您可以從jsonSerialize()方法中返回任何你想要的。您可以省略屬性,類中不存在的「發明」屬性,計算值等。

請注意,json_decode()沒有任何反向方法可用。因爲PHP對象的類不是以JSON表示編碼的,所以json_encode()只能創建stdClass對象(或關聯數組)。這使得這種解碼方法無用。

但是,在解碼時,很容易將數組或stdClass對象傳遞給MyClassName類的構造函數或使用解碼數據恢復對象狀態的初始化方法。

+0

如果我使用這種方法,那麼生成的JSON數據是否仍將我的對象表示爲對象,還是會將其轉換爲數組? – UnkwnTech

+0

如果一個數組具有以'0'開始的數字正數和連續鍵,那麼它在JSON中被編碼爲數組。否則(字符串鍵,間隙,不以'0'開始)將其編碼爲對象。這是因爲JSON是Javascript的一個子集,而Javascript數組只有數字鍵。數組鍵不用JSON編碼(這就是爲什麼它們必須是數字,正數,連續並以'0'開始)。爲了回答您的具體問題,我發佈在答案中的示例代碼返回的數組以JSON數組編碼。 – axiac

2

PHP提供了JsonSerializable接口這個目的:

class MyClassName implements JsonSerializable 
{ 
    public $Value; 
    public $OtherValue; 

    function jsonSerialize() 
    { 
     return array_change_key_case((array) $this, CASE_LOWER); 
    } 
} 
相關問題