如何在php中用json编码私有属性?

hvvq6cgz  于 2023-01-06  发布在  PHP
关注(0)|答案(4)|浏览(160)

我使用的是Doctrine 2和zend framework 1.11。公共属性在Doctrine 2中是不受鼓励的,所以我将我的实体属性设置为私有的。然而,我刚刚了解到Zend_Json::encode()和json_encode()不会看到私有/受保护的属性,因此不会将它们添加到它们的输出中。
因此,当我使用,和var_dump,我得到一个空集,如字符串(4)“[{}]"。
原来我必须写我自己的函数来做编码。我希望有人有一个解决方案,我可以用来代替。

5us2dqdw

5us2dqdw1#

将成员变量设为private的全部目的是防止它们对任何外部代码可见(序列化是一个例外,因为整个对象需要在会话之间恢复)。
您也许应该使用方法“encode”创建一个接口“encodeable”,而不是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);
blmhpbnm

blmhpbnm2#

我相信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;
 }
}
icomxhvb

icomxhvb3#

可以在将对象传递到json_encode()之前对其进行serialize()

bxfogqkk

bxfogqkk4#

在类中创建一个方法:

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

相关问题