Zend_Json-Objects.xml 7.1 KB

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