我有一個類,它被序列化爲json和內置的json_encode。然而,當這個對象被編碼時,我想要對它的某些屬性進行不同的編碼。例如,在下面的代碼中,我希望使用小寫名稱對屬性進行編碼(即,值變爲值)。它可以自定義json_encode的方式,編碼我的對象?
class MyClassName
{
public $Value;
public $OtherValue;
}
我有一個類,它被序列化爲json和內置的json_encode。然而,當這個對象被編碼時,我想要對它的某些屬性進行不同的編碼。例如,在下面的代碼中,我希望使用小寫名稱對屬性進行編碼(即,值變爲值)。它可以自定義json_encode的方式,編碼我的對象?
class MyClassName
{
public $Value;
public $OtherValue;
}
閱讀(並在課堂上實施)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
類的構造函數或使用解碼數據恢復對象狀態的初始化方法。
PHP提供了JsonSerializable
接口這個目的:
class MyClassName implements JsonSerializable
{
public $Value;
public $OtherValue;
function jsonSerialize()
{
return array_change_key_case((array) $this, CASE_LOWER);
}
}
另一種方法可能是,當你收到JSON使用功能-ING呼應 –
之前爲小寫對象的第一個字母有函數,作爲'strtolower',有一個選項可以在你的類中添加一個方法,比如'toArray',它可以按照你希望他們編碼的方式返回屬性,你只需要花費很少的精力來準備數據的方式,你需要它,而不是期望從簡單的功能奇蹟和頭腦閱讀。 –
@ N.B。兩者之間的問題是我不想讓我的變量名小寫。所以我不能簡單地小寫變量。 – UnkwnTech