Zend_Json-Objects.xml 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.json.advanced">
  4. <title>Uso Avanzado de Zend_Json</title>
  5. <sect2 id="zend.json.advanced.objects1">
  6. <title>Objetos JSON</title>
  7. <para> Cuando se codifican objetos <acronym>PHP</acronym> como JSON, todas las propiedades
  8. públicas de ese objeto serán codificadas en un objeto JSON. </para>
  9. <para> JSON no permite referencias a objetos, de manera que debe tenerse cuidado de no
  10. codificar objetos con referencias recursivas. Si tiene problemas con la recursión,
  11. <classname>Zend_Json::encode()</classname> y
  12. <classname>Zend_Json_Encoder::encode()</classname> permiten un segundo parámetro
  13. opcional para comprobar si hay recursión; si un objeto es serializado dos veces, se
  14. emitirá una excepción. </para>
  15. <para> La decodificación de objetos JSON plantea una dificultad adicional, sin embargo, ya
  16. que los objetos Javascript se corresponden más estrechamente a un array asociativo de
  17. <acronym>PHP</acronym>. Algunos sugieren que debe pasarse un identificador de clase,
  18. y una instancia del objeto de esa clase debe crearse y alimentarla con datos de pares
  19. clave/valor del objeto JSON; otros consideran que esto podría plantear un considerable
  20. riesgo de seguridad. </para>
  21. <para> Por defecto, <classname>Zend_Json</classname> decodificará objetos JSON como arrays
  22. asociativos. Sin embargo, si desea retornar un objeto, puede especificar esto: </para>
  23. <programlisting language="php"><![CDATA[
  24. // Decodifica objetos JSON como objetos PHP
  25. $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
  26. ]]></programlisting>
  27. <para> Por lo tanto, cualquiera de los objetos decodificados son devueltos como objetos
  28. <methodname>StdClass</methodname> con propiedades correspondientea a pares
  29. clave/valor en la notación JSON. </para>
  30. <para> La recomendación de Zend Framework es que el desarrollador debe decidir cómo
  31. decodificar objetos JSON. Si debe crearse un objeto de un determinado tipo, puede ser
  32. creado en el código del desarrollador y alimentado con datos de los valores
  33. decodificados utilizando <classname>Zend_Json</classname>. </para>
  34. </sect2>
  35. <sect2 id="zend.json.advanced.objects2">
  36. <title>Codificando Objetos PHP</title>
  37. <para> Si se codifican objetos <acronym>PHP</acronym> por defecto, el mecanismo de
  38. codificación sólo tiene acceso a las propiedades públicas de estos objetos. Cuando se
  39. implementa un método <methodname>toJson()</methodname> en un objeto a codificar,
  40. <classname>Zend_Json</classname> llama a este método y espera que el objeto devuelva
  41. una representación JSON de su estado interno. </para>
  42. </sect2>
  43. <sect2 id="zend.json.advanced.internal">
  44. <title>Codificador/Decodificador Interno</title>
  45. <para> Zend_Json tiene dos modos diferentes dependiendo de si ext/json está habilitada o no
  46. en su instalación <acronym>PHP</acronym>. Si ext/json está instalado por defecto, las
  47. funciones <methodname>json_encode()</methodname> y
  48. <methodname>json_decode()</methodname> se utilizan para la codificación y
  49. decodificación JSON. Si ext/json no está instalado, una implementación de Zend Framework
  50. en código <acronym>PHP</acronym> es utilizada para la codificación/decodificación. Esto
  51. es considerablemente más lento que usando la extensión de <acronym>PHP</acronym>, pero
  52. se comporta exactamente igual. </para>
  53. <para> También algunas veces puede querer utilizar el codificador/decodificador interno
  54. incluso si tiene ext/json instalado. Puede hacer esto llamando a: </para>
  55. <programlisting language="php"><![CDATA[
  56. Zend_Json::$useBuiltinEncoderDecoder = true:
  57. ]]></programlisting>
  58. </sect2>
  59. <sect2 id="zend.json.advanced.expr">
  60. <title>Expresiones JSON</title>
  61. <para> Javascript hace uso intenso de las funciones anónimas de llamadas de retorno, que
  62. pueden guardarse en variables del objeto JSON. Aunque solo funcionan si no regresaron
  63. dentro comillas dobles, que es lo que hace naturalmente
  64. <classname>Zend_Json</classname>. Con la Expression de apoyo para Zend_Json este apoyo
  65. puede codificar objetos JSON con callbacks validos de javascript. Esto funciona tanto
  66. con <methodname>json_encode()</methodname> como con el codificador interno. </para>
  67. <para> Un callback javascript se representa usando el objero
  68. <classname>Zend_Json_Expr</classname>. Este implementa el patrón del objeto valor y
  69. es inmutable. Se puede establecer la expresión de javascript como el primer argumento
  70. del constructor. Por defecto <classname>Zend_Json::encode</classname> no codifica
  71. callbacks javascript, usted tiene que pasar la opción <methodname>'enableJsonExprFinder'
  72. = true</methodname> dentro de la función <methodname>encode</methodname>. Si se
  73. habilita, la expresión de apoyo trabaja para todas las expresiones anidadas en grandes
  74. estructuras de objetos. Un ejemplo de uso se vería así: </para>
  75. <programlisting language="php"><![CDATA[
  76. $data = array(
  77. 'onClick' => new Zend_Json_Expr('function() {'
  78. . 'alert("Yo soy un callback válido de javascript '
  79. . 'creado por Zend_Json"); }'),
  80. 'other' => 'sin expresión',
  81. );
  82. $jsonObjectWithExpression = Zend_Json::encode(
  83. $data,
  84. false,
  85. array('enableJsonExprFinder' => true)
  86. );
  87. ]]></programlisting>
  88. </sect2>
  89. </sect1>