Zend_Json-Objects.xml 6.0 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 <acronym>JSON</acronym>, todas las propiedades
  8. públicas de ese objeto serán codificadas en un objeto <acronym>JSON</acronym>. </para>
  9. <para> <acronym>JSON</acronym> 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. <methodname>Zend_Json::encode()</methodname> y
  12. <methodname>Zend_Json_Encoder::encode()</methodname> 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 <acronym>JSON</acronym> 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 <acronym>JSON</acronym>; otros consideran que esto podría plantear un considerable
  20. riesgo de seguridad. </para>
  21. <para> Por defecto, <classname>Zend_Json</classname> decodificará objetos <acronym>JSON</acronym> 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 <acronym>JSON</acronym>. </para>
  30. <para> La recomendación de Zend Framework es que el desarrollador debe decidir cómo
  31. decodificar objetos <acronym>JSON</acronym>. 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 <acronym>JSON</acronym> 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 <acronym>JSON</acronym>. 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 <acronym>JSON</acronym>. 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 <acronym>JSON</acronym> 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>