Zend_Json-Objects.xml 6.1 KB

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