Как мне json кодировать частные свойства в php? - PullRequest
3 голосов
/ 07 июля 2011

Я работаю с доктриной 2 и Zend Framework 1.11. Общедоступные свойства не рекомендуются в Doctrine 2, поэтому я сделал свои свойства сущностей закрытыми. Однако я только что узнал, что Zend_Json :: encode () и json_encode () не увидят приватные / защищенные свойства и, следовательно, не добавят их в свой вывод.

Поэтому, когда я использую либо var_dump, я получаю пустой набор, например string (4) "[{}]".

Оказывается, я должен написать свою собственную функцию для кодирования. Я надеялся, что у кого-то есть решение, которое я могу использовать вместо этого.

Ответы [ 4 ]

6 голосов
/ 07 июля 2011

Смысл использования переменных-членов как приватных состоит в том, чтобы предотвратить их видимость для любого внешнего кода (сериализация - исключение, потому что весь объект нужно будет восстанавливать между сеансами).

Вместо json_encoding этого объекта, возможно, вам следует создать интерфейс, «кодируемый» с помощью метода «кодировать». Это вернет json-кодированную строку любого из членов, необходимых для этого объекта. Это дает вам дополнительный контроль, потому что вместо сериализации всех членов вы можете выбрать тех, кого хотите сериализовать, и даже выполнить над ними операции для сериализации других данных.

На самом деле вы можете изменить интерфейс JsonSerializable, который работает напрямую с json_encode.

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

$myObject = new MyClass();
echo json_encode($myObject);
2 голосов
/ 06 августа 2012

Я полагаю, что в 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;
 }
}
0 голосов
/ 18 марта 2014

Создайте метод, как это в вашем классе:

function serialize(){
    return json_encode(get_object_vars ($this));
}
0 голосов
/ 07 июля 2011

Вы можете serialize () ваш объект, прежде чем передать его в json_encode ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...