<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.json.advanced">
    <title>Uso Avanzado de Zend_Json</title>

    <sect2 id="zend.json.advanced.objects1">
        <title>Objetos JSON</title>
        <para>
            Cuando se codifican objetos PHP como JSON, todas las propiedades 
            públicas de ese objeto serán codificadas en un objeto JSON.
        </para>
        <para>
            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, 
            <classname>Zend_Json::encode()</classname> y 
            <classname>Zend_Json_Encoder::encode()</classname> permiten un 
            segundo parámetro opcional para comprobar si hay recursión; si un 
            objeto es serializado dos veces, se emitirá una excepción.
        </para>
        <para>
            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.
        </para>
        <para>
            Por defecto, <classname>Zend_Json</classname> decodificará objetos 
            JSON como arrays asociativos. Sin embargo, si desea retornar un 
            objeto, puede especificar esto:
        </para>
         <programlisting language="php"><![CDATA[
// Decodifica objetos JSON como objetos PHP
$phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
]]></programlisting>
        <para>
            Por lo tanto, cualquiera de los objetos decodificados son devueltos 
            como objetos <methodname>StdClass</methodname> con propiedades correspondientea 
            a pares clave/valor en la notación JSON.
        </para>
        <para>
            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 
            <classname>Zend_Json</classname>.
        </para>
    </sect2>

    <sect2 id="zend.json.advanced.objects2">
        <title>Codificando Objetos PHP</title>

        <para>
            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 <methodname>toJson()</methodname> en un objeto a 
            codificar, <classname>Zend_Json</classname> llama a este método y 
            espera que el objeto devuelva una representación JSON de su estado  
            interno.
        </para>
    </sect2>

    <sect2 id="zend.json.advanced.internal">
        <title>Codificador/Decodificador Interno</title>

        <para>
            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 <methodname>json_encode()</methodname> y 
            <methodname>json_decode()</methodname> 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.
        </para>

        <para>
            También algunas veces puede querer utilizar el codificador/decodificador 
            interno incluso si tiene ext/json instalado. Puede hacer esto 
            llamando a:
        </para>

         <programlisting language="php"><![CDATA[
Zend_Json::$useBuiltinEncoderDecoder = true:
]]></programlisting>
    </sect2>

    <sect2 id="zend.json.advanced.expr">
        <title>Expresiones JSON</title>

        <para>
            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 <classname>Zend_Json</classname>. 
            Con la Expression de apoyo para Zend_Json este apoyo puede codificar  
            objetos JSON con callbacks validos de javascript. 
            Esto funciona tanto con <methodname>json_encode()</methodname> como con el 
            codificador interno.
        </para>

        <para>
            Un callback javascript se representa usando el objero 
            <classname>Zend_Json_Expr</classname>. 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 <classname>Zend_Json::encode</classname> no codifica 
            callbacks javascript, usted tiene que pasar la opción 
            <methodname>'enableJsonExprFinder' = true</methodname> dentro de la función 
            <methodname>encode</methodname>. 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í:
        </para>

         <programlisting language="php"><![CDATA[
$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)
);
]]></programlisting>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
