TigerZF
🌐Español

39.3. Uso avanzado de Zend_Json

39.3.1. Objetos JSON

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.

39.3.2. Codificación de objetos PHP

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.

39.3.3. Codificador/decodificador 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:

39.3.4. Expresiones JSON

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)
);