# 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:

    // Decodifica objetos JSON como objetos PHP
    $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);

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:

    Zend_Json::$useBuiltinEncoderDecoder = true:

## 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í:

    $data = array(
        'onClick' => 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)
    );