Zend_Json-Objects.xml 6.3 KB

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