我有一个类,它通过内置的json_encode序列化为JSON。然而,当这个对象被编码时,我希望它的某些属性被不同地编码。例如,在下面的代码中我喜欢用小写名称编码的属性(即Value变为值)。
class MyClassName
{
public $Value;
public $OtherValue;
}
答案 0 :(得分: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
类的构造函数,或者传递给可以使用解码数据恢复对象状态的初始化方法。
答案 1 :(得分:2)
PHP为此目的提供了JsonSerializable
接口:
class MyClassName implements JsonSerializable
{
public $Value;
public $OtherValue;
function jsonSerialize()
{
return array_change_key_case((array) $this, CASE_LOWER);
}
}