可以自定义json_encode的方式,对我的对象进行编码吗?

时间:2016-12-29 20:59:24

标签: php json

我有一个类,它通过内置的json_encode序列化为JSON。然而,当这个对象被编码时,我希望它的某些属性被不同地编码。例如,在下面的代码中我喜欢用小写名称编码的属性(即Value变为值)。

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

2 个答案:

答案 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);
    }
}