Uso Avanzado de Zend_Json
Objetos JSON
Cuando se codifican objetos PHP como JSON, todas las propiedades
públicas de ese objeto serán codificadas en un objeto JSON.
JSON no permite referencias a objetos, de manera 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 si hay recursión; si un
objeto es serializado dos veces, se emitirá una excepción.
La decodificación de objetos JSON plantea una dificultad adicional,
sin embargo, ya que los objetos Javascript se corresponden más
estrechamente a un array asociativo de PHP.
Algunos sugieren que debe pasarse un identificador de clase, y una
instancia del objeto de esa clase debe crearse y alimentarla con datos
de pares clave/valor del objeto JSON; otros consideran que esto podría
plantear un considerable riesgo de seguridad.
Por defecto, Zend_Json decodificará objetos
JSON como arrays asociativos. Sin embargo, si desea retornar un
objeto, puede especificar esto:
Por lo tanto, cualquiera de los objetos decodificados son devueltos
como objetos StdClass con propiedades correspondientea
a pares clave/valor en la notación JSON.
La recomendación de Zend Framework es que el desarrollador debe
decidir cómo decodificar objetos JSON. Si debe crearse un objeto de
un determinado tipo, puede ser creado en el código del desarrollador
y alimentado con datos de los valores decodificados utilizando
Zend_Json.
Codificando Objetos PHP
Si se codifican objetos PHP por defecto, el mecanismo de codificación
sólo tiene acceso a las propiedades públicas de estos objetos.
Cuando se implementa un método toJson() 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.
Codificador/Decodificador Interno
Zend_Json tiene dos modos diferentes dependiendo de si ext/json está
habilitada o no en su instalación PHP. Si ext/json está instalado
por defecto, las funciones json_encode() y
json_decode() se utilizan para la codificación y
decodificación JSON. Si ext/json no está instalado, una implementación
de Zend Framework en código PHP es utilizada para la
codificación/decodificación. Esto es considerablemente más lento que
usando la extensión de php, pero se comporta exactamente igual.
También algunas veces puede querer utilizar el codificador/decodificador
interno incluso si tiene ext/json instalado. Puede hacer esto
llamando a:
Expresiones JSON
Javascript hace uso intenso de las funciones anónimas de llamadas
de retorno, que pueden guardarse en variables del objeto JSON.
Aunque solo funcionan si no regresaron dentro comillas dobles, que
es lo que hace naturalmente Zend_Json.
Con la Expression de apoyo para Zend_Json este apoyo puede codificar
objetos JSON con callbacks validos de javascript.
Esto funciona tanto con json_encode() como con el
codificador interno.
Un callback javascript se representa usando el objero
Zend_Json_Expr. Este implementa el patrón del
objeto valor y es inmutable. Se puede establecer la expresión de
javascript como el primer argumento del constructor.
Por defecto Zend_Json::encode no codifica
callbacks javascript, usted tiene que pasar la opción
'enableJsonExprFinder' = true dentro de la función
encode. Si se habilita, la expresión de apoyo trabaja
para todas las expresiones anidadas en grandes estructuras de objetos.
Un ejemplo de uso se vería así:
new Zend_Json_Expr('function() {'
. 'alert("Yo soy un callback válido de javascript '
. 'creado por Zend_Json"); }'),
'other' => 'sin expresión',
);
$jsonObjectWithExpression = Zend_Json::encode(
$data,
false,
array('enableJsonExprFinder' => true)
);
]]>