<?xml version="1.0" encoding="UTF-8"?>
    <!-- EN-Revision: 17227 -->
    <!-- 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 <acronym>PHP</acronym> como
                <acronym>JSON</acronym> , todas las propiedades públicas de ese
            objeto serán codificadas en un objeto <acronym>JSON</acronym> . </para>
        <para>
            <acronym>JSON</acronym> 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,
                <methodname>Zend_Json::encode()</methodname> y
                <methodname>Zend_Json_Encoder::encode()</methodname> 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 <acronym>JSON</acronym> plantea una
            dificultad adicional, sin embargo, ya que los objetos Javascript se
            corresponden más estrechamente a un array asociativo de
                <acronym>PHP</acronym> . 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
                <acronym>JSON</acronym> ; otros consideran que esto podría
            plantear un considerable riesgo de seguridad. </para>
        <para> Por defecto, <classname>Zend_Json</classname> decodificará
            objetos <acronym>JSON</acronym> 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
                <acronym>JSON</acronym> . </para>
        <para> La recomendación de Zend Framework es que el desarrollador debe
            decidir cómo decodificar objetos <acronym>JSON</acronym> . 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 <acronym>PHP</acronym> 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 <acronym>JSON</acronym> 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 <acronym>PHP</acronym> . 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 <acronym>JSON</acronym> . Si ext/json
            no está instalado, una implementación de Zend Framework en código
                <acronym>PHP</acronym> es utilizada para la
            codificación/decodificación. Esto es considerablemente más lento que
            usando la extensión de <acronym>PHP</acronym> , 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
                <acronym>JSON</acronym> . 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
                <acronym>JSON</acronym> 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 <constant>Zend_Json::encode</constant> 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>
