我如何json编码PHP中的私有属性?

时间:2011-07-07 16:19:00

标签: php json

我正在使用doctrine 2和zend framework 1.11。在Doctrine 2中不鼓励公共属性,因此我将我的实体属性设为私有。但是我刚刚了解到Zend_Json :: encode()和json_encode()不会看到私有/受保护的属性,因此不会在它们的输出中添加它们。

因此当我使用和var_dump时,我得到一个空集,例如string(4)“[{}]”。

事实证明我必须编写自己的函数来进行编码。我希望有人有一个我可以使用的解决方案。

4 个答案:

答案 0 :(得分:6)

将成员变量设置为私有的全部意义是防止它们对任何外部代码可见(序列化是一个例外,因为整个对象需要在会话之间恢复)。

您可能应该使用方法“encode”创建一个“可编码”接口,而不是对此对象进行json_encoding。这将返回此对象所需的任何成员的json编码字符串。这为您提供了额外的控制,因为您可以选择要序列化的成员,甚至可以对它们执行操作以序列化其他数据,而不是序列化所有成员。

实际上,您可以使用直接与json_encode一起使用的JsonSerializable界面。

class MyClass implements \JsonSerializable
{
    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}

$myObject = new MyClass();
echo json_encode($myObject);

答案 1 :(得分:2)

我相信php 5.4有JsonSerializable,这应该会让事情变得更容易,但我正在使用php 5.3.8。我没有尽可能多地对此进行测试,并认为我会满足于将我的属性公开,但这似乎适用于我自己的课程:

class JSONEncoder{

public function json_encode($object){
    return json_encode($this->getFields($object));
}

private function getFields($classObj){
    $fields = array();
    $reflect = new ReflectionClass($classObj);
    $props   = $reflect->getProperties();
    foreach($props as $property){
        $property->setAccessible(true);
        $obj = $property->getValue($classObj);
        $name = $property->getName();
        $this->doProperty($fields, $name, $obj);
    }

    return $fields;

 }

 private function doProperty(&$fields, $name, $obj){

     if (is_object($obj)){
         $fields[$name] = $this->getFields($obj);
         return;
     }

     if (is_Array($obj)){
         $arrayFields = Array();
         foreach ($obj as $item){
             $key = key($obj);
             $this->doProperty($arrayFields, $key, $item);
             next($obj);
         }
         $fields[$name] = $arrayFields;
     }
     else 
         $fields[$name] = $obj;
 }
}

答案 2 :(得分:0)

您可以在将对象传递给json_encode()

之前serialize()

答案 3 :(得分:0)

在你的班级中创建一个方法:

function serialize(){
    return json_encode(get_object_vars ($this));
}