Содержание


Расширенное использование


Advanced Usage, JSON, ЗФ2, Zend Framework 2, ZF2, ру, ru




Объекты JSON



 

При кодировании объектов PHP в формат JSON, все публичные свойства (public properties) объекта будут закодированы в объект JSON.

 

JSON не поддерживать объектные ссылки, поэтому необходимо соблюдать осторожность при кодировании объектов, содержащих рекурсивные ссылки. Но если у Вас все таки имеются рекурсии, то методы «Zend\Json\Json::encode()» и «Zend\Json\Encoder::encode()»  предоставляют проверку на рекурсию -  второй необязательный параметр. Если объект сериализируется дважды – выбросится исключение.

 

Декодирования JSON объектов представляет дополнительную трудность, но объекты Javascript очень похожи на ассоциативные массивы PHP. Одни считают, что нужно передавать идентификатор класса, что бы создать экземпляр объекта этого класса и заполнить его парами ключ/значение объекта JSON. Другие – что такой подход может негативно сказаться на безопасности системы.

 

По умолчанию, Zend\Json\Json, декодирует JSON объекты как ассоциативные массивы. Но если Вам необходимо, что бы возвращался объекта, то это можно реализовать следующим образом:

 

// Decode JSON objects as PHP objects
$phpNative = Zend\Json\Json::decode($encodedValue, Zend\Json\Json::TYPE_OBJECT);

Все декодированные объекты возвращаются как объекты «StdClass» со свойствами, соответствующими парам ключ/значение нотации JSON.

 

Каждый разработчик должен самостоятельно определять, каким образом ему удобнее декодировать объекты JSON. Если объекты заданного типа должен быть создан, то он создается в коде разработчика и заполняется значениями, полученными из Zend\Json.

 

Кодирование PHP объектов



 

Если Вы используете механизм кодирования по умолчанию, то получите доступ только к публичным свойствам кодируемого объекта. При использовании метода «toJson()» для кодирования объекта, Zend\Json\Json вызывает этот метод и ожидает, что вернется JSON представление объекта.

 

Zend\Json\Json может кодировать (преобразовывать) объекты PHP рекурсивно, но не делает этого по умолчанию. Для активации необходимо передать как второй параметр «TRUE» в метод «Zend\Json\Json::encode().»:

// Encode PHP object recursively
$jsonObject = Zend\Json\Json::encode($data, true);

Внутренний кодер / декодер

 

У Zend\Json имеются два различных режима, в зависимости от включенных/отключенных  «ext/json» в Вашем PHP. Если «ext/json» установлены по умолчанию, то функции «json_encode()» и «json_decode()» используются для кодирования/декодирования JSON. Если же PHP расширение JSON не установлено, то для этого будет использована Zend Framework реализация. Это медленнее, чем расширение, но результаты такие же и работает всегда.

 

Иногда возникают ситуации, когда необходимо использовать внутренний кодер/декодре, даже если соответствующее расширение установлено:

ZendJsonJson::$useBuiltinEncoderDecoder = true:


JSON выражения (Expressions)



 

В Javascript активно используются анонимные функции обратного вызова, которые могут быть преобразованы в JSON. Однако эти функции работают, только если не заключены в двойные кавычки, которые Zend\Json добавляет. Но с поддержкой выражений «Expressions» в Zend\Json у Вас появляется возможность нормально  кодировать функции обратного вызова  Эта возможность доступна как для json_encode() так и для внутренней реализации.

 

Функции обратного вызова javascript представляются как объекты Zend\Json\Expr. Включить выражение javascript можно, передав как первый аргумент в конструктор. По умолчанию выражение javascript не используется.  Для его активации передайте опцию «enableJsonExprFinder» со значением «TRUE» в кодирующую функцию. После его активации он будет применяется ко всем структурам, а так же ко вложенным.

 

Пример использования:

 

$data = array(
    'onClick' => new Zend\Json\Expr('function() {'
              . 'alert("I am a valid javascript callback '
              . 'created by ZendJson"); }'),
    'other' => 'no expression',
);
$jsonObjectWithExpression = Zend\Json\Json::encode(
    $data,
    false,
    array('enableJsonExprFinder' => true)
);

Автор статьи: DuB