Al codificar objetos PHP como JSON, todas las propiedades públicas de ese objeto se codificarán en un objeto JSON.
JSON no permite referencias a objetos, por lo que debe tenerse cuidado de no
codificar objetos con referencias recursivas. Si tiene problemas con
la recursión, Zend_Json::encode() y
Zend_Json_Encoder::encode() permiten un segundo
parámetro opcional para comprobar la recursión; si un objeto se serializa dos veces, se
lanzará una excepción.
Sin embargo, decodificar objetos JSON plantea una dificultad adicional, ya que los objetos de Javascript se corresponden más estrechamente con el array asociativo de PHP. Algunos sugieren que se debería pasar un identificador de clase, y se debería crear una instancia de un objeto de esa clase y rellenarla con los pares clave/valor del objeto JSON; otros consideran que esto podría suponer un riesgo de seguridad considerable.
Por defecto, Zend_Json decodificará los objetos JSON
como arrays asociativos. Sin embargo, si desea que se devuelva un objeto, puede especificar esto:
// Decode JSON objects as PHP objects $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
Cualquier objeto decodificado de esta forma se devuelve como objetos StdClass
con propiedades correspondientes a los pares clave/valor en la notación
JSON.
La recomendación de Zend Framework es que cada
desarrollador decida cómo decodificar los objetos JSON. Si se debe crear un objeto de un
tipo especificado, puede crearse en el código del desarrollador
y rellenarse con los valores decodificados usando Zend_Json.
Si está codificando objetos PHP, por defecto el mecanismo de codificación
solo puede acceder a las propiedades públicas de esos objetos. Cuando un método
toJson() está implementado en un objeto a codificar,
Zend_Json llama a este método y espera que el objeto devuelva una
representación JSON de su estado interno.
Zend_Json tiene dos modos diferentes dependiendo de si ext/json está
habilitado en su instalación de PHP o no. Si ext/json está instalado, por
defecto se usan las funciones json_encode() y
json_decode() para codificar y decodificar
JSON. Si ext/json no está instalado, se usa una implementación de Zend Framework en
código PHP para la codificación/decodificación. Esto es considerablemente más lento que
usar la extensión de PHP, pero se comporta exactamente igual.
Aun así, a veces puede querer usar el codificador/decodificador interno aunque tenga ext/json instalado. Puede lograrlo llamando a:
Zend_Json::$useBuiltinEncoderDecoder = true:
Javascript hace un uso intensivo de funciones de callback anónimas, que se pueden guardar
dentro de variables de objeto JSON. Aun así, solo funcionan si no se
devuelven dentro de comillas dobles, lo cual Zend_Json hace naturalmente.
Con el soporte de expresiones para Zend_Json, puede codificar
objetos JSON con callbacks de javascript válidos. Esto funciona tanto para
json_encode() como para el codificador interno.
Un callback de javascript se representa usando el objeto Zend_Json_Expr.
Este implementa el patrón de objeto de valor y es inmutable. Puede establecer la
expresión de javascript como el primer argumento del constructor. Por defecto,
Zend_Json::encode no codifica los callbacks de javascript, tiene
que pasar la opción enableJsonExprFinder y establecerla en
TRUE en la función encode(). Si
está habilitada, el soporte de expresiones funciona para todas las expresiones anidadas en estructuras
de objetos grandes. Un ejemplo de uso sería el siguiente:
$data = array(
'onClick' => new Zend_Json_Expr('function() {'
. 'alert("I am a valid javascript callback '
. 'created by Zend_Json"); }'),
'other' => 'no expression',
);
$jsonObjectWithExpression = Zend_Json::encode(
$data,
false,
array('enableJsonExprFinder' => true)
);