| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- <?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 <acronym>PHP</acronym> 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
- <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 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 <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 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 <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 JSON. 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 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>
|