Zend_Json-Objects.xml 6.0 KB

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