16.3. Объекты JSON

Когда объекты PHP закодировываются в JSON, все публичные свойства этого объекта будут закодированы в объект JSON.

JSON не поддерживает ссылки на объекты, поэтому следите за тем, чтобы не закодировывать объекты с рекурсивными ссылками. Если вы имеете дело с рекурсией, то в вызове методов Zend_Json::encode() и Zend_Json_Encoder::encode() можно установить второй необязательный параметр для проверки на рекурсию; если один и тот же объект подвергается сериализации дважды, то будет сгенерировано исключение.

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

По умолчанию Zend_Json будет декодировать объекты JSON как ассоциативные массивы. Но если вы хотите получить объект, то можете указать это:

<?php
// Декодировать объект как объект
$phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
?>

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

Рекомендацией Zend Framework является то, что разрабочик должен сам принимать решение, как декодировать объект JSON. Если должен быть создан объект определенного типа, он может быть создан в коде разработчика и заполнен значениями, декодированными с помощью Zend_Json.