| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?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:
- -->
|