Trabajar Con JSON Desde PHP

download Trabajar Con JSON Desde PHP

of 19

Transcript of Trabajar Con JSON Desde PHP

Trabajas con SJON desde PHPhttp://www.desarrolloweb.com/manuales/php-json.html

Informacin sobre las distintas libreras y opciones para utilizar la notacin de objetos Javascript JSON en programas realizados con el lenguaje PHP.PorMiguel Angel AlvarezJSON es una notacin Javascript para escribir objetos que se ha hecho bastante popular en el mundo del desarrollo de webs y que se utiliza en diversos lenguajes de programacin, componentes (habitualmente Ajax), etc. Su xito se debe a que es una excelente forma para almacenar informacin que deseamos compartir entre distintos componentes o lenguajes de las aplicaciones web. Si trabajamos con Ajax y alguno de los frameworks Javascript existentes, ya habremos notado esta posibilidad y posiblemente ya estemos utilizando JSON o una notacin similar.JSON, cuyas siglas significan JavaScript Object Notation (en espaol Notacin de Objetos de JavaScript), es un formato ligero, fcil de escribir o codificar, as como tambin es fcil de leer por los seres humanos. Desde Javascript podemos procesar directamente cualquier objeto JSON y existen libreras para la mayora de los lenguajes de programacin que tienen funciones para interpretar este formato. Por ello se ha adoptado universalmente. Para ms informacin podemos visitar el sitio web de JSON enhttp://www.json.org/.Esto quiere decir que con JSON podemos comunicar datos fcilmente entre scripts Javascript y scripts PHP. Por ejemplo, pensemos en una validacin de formulario que se desea hacer con Ajax. Los datos del formulario se pueden enviar a PHP por medio de POST y luego podramos desde PHP enviar a Javascript el resultado de validar esos datos en el servidor. Como la validacin puede ser positiva o negativa, as como puede tener ms o menos cdigos de error y acciones a realizar dependiendo de la informacin procesada, el script PHP tiene que mandar una respuesta ms o menos elaborada al script Javascript y una posibilidad es enviar esos datos desde PHP utilizando la notacin JSON.1 Disponibilidad de las funciones JSON en PHPPHP dispone de varias funciones para hacer distintos tratamientos con notacin de objetos JSON, que permite convertir un objeto PHP, o cualquier otro tipo de variable, a un string con notacin JSON, as como crear un objeto PHP a partir de un string codificado con JSON.En PHP, como decamos, es posible producir y consumir datos cargados con notacin JSON, por medio de unas funciones de las que dispone el lenguaje, que existen de manera predeterminada en los servidores modernos de PHP y que se pueden utilizar tambin en instalaciones antiguas de PHP, aunque con algn trabajo de instalacin adicional.A partir de PHP 5.2 lasfunciones JSONestn disponibles siempre, pero si utilizamos por ejemplo PHP 4 tendramos que instalarlas manualmente. Para ello existen varios paquetes de libreras, que provienen de diversas fuentes, que tienen funciones para tratar con JSON desde PHP.-Paquete JSON de PECLEste paquete, del repositorio de libreras PHP PECL, es compatible con PHP 4.3.0 o superior. En versiones superiores a PHP 5.2 est disponible por defecto. En versiones anteriores del lenguaje se tendra que instalar de manera separada.-Librera JSON-PHPEs una librera de funciones que se conoce tambin con el nombre de "Services_JSON". Originariamente escrita por Michal Migurski, en la actualidad se encuentra disponible dentro del framework PHP PEAR:http://pear.php.net/package/Services_JSON-JSON Lib en Zend FrameworkEs una librera de funciones para tratamiento con JSON que forma parte del framework PHP Zend.-XML-RPC para PHPPor medio de una extensin para la librera php-xmlrpc, tambin se puede tratar con notacin de objetos JSON.Las particularidades de cada sistema son ligeramente distintas. Cabe decir que la ms interesante sera la primera, que forma parte de PECL, puesto que est escrita en C y por tanto ser ms rpida de ejecutarse, al formar parte de los componentes nativos de PHP. Como decimos slo podremos disponer de ella a partir de PHP 5.2, pero en servidores antiguos tendramos que instalarla aparte, lo que a menudo ser complicado, o incluso imposible para sitios web en produccin y en un alojamiento compartido.As que, si nuestro servidor PHP no dispone de las funciones JSON por estar poco actualizado, nos costar mucho menos esfuerzo y dolores de cabeza utilizar otra librera distinta a la bsica de PECL. En este caso, por la facilidad de instalacin, se recomendara la utilizacin de la librera que viene en PEAR, que se puede descargar del propio sitio de PEAR, en la URL http://pear.php.net/package/Services_JSONNota:Hemos publicado en DesarrolloWeb.com en pasados artculos algunas referencias tiles parainstalar PEARy utilizar algunoscomponentes de este framework PHP.este framework PHP.Existe un artculo muy interesante, aunque en ingls, quecompara las diversas libreras existentes para usar JSON desde PHP, que contiene diversas informaciones tcnicas, requisitos y un anlisis del desempeo de cada una.En el prximo artculo explicaremos cmoutilizar las funciones JSON en PHPpor medio de las funciones nativas del lenguaje.

Mostramos el modo de producir una cadena con notacin JSON a partir de variables y objetos de PHP con la funcin json_encode().PorMiguel Angel AlvarezEn este artculo vamos a mostrar cmo crear un JSON desde PHP con las funciones nativas del lenguaje de programacin del lado del servidor. Adems veremos varias particularidades de la creacin de cadenas de texto con notacin JSON desde PHP, que son importantes de conocer para no caer en problemas comunes de este tipo de operaciones.Como ya comentamos en el artculo anterior, en el que presentamos laslibreras ms fundamentales hacer JSON desde PHP, existen diversas formas para implementar funcionalidades de procesamiento de archivos JSON desde PHP. En concreto en este artculo vamos a ver las funciones nativas de PHP que sirven para este tema, que se encuentran disponibles desde la versin de PHP 5.2. Cabe recordar, no obstante, que estas mismas funciones nativas se pueden instalar por separado, si es que no las tenemos y que existen otras libreras que tambin ofrecen posibilidades similares.Veremos entonces cmo producir cadenas con notacin JSON a partir de variables simples, arrays y objetos PHP.2 Crear un JSON desde PHPPara crear una cadena para expresar un objeto u otro tipo de variable con JSON en PHP se dispone de una funcin llamada json_encode(), que recibe lo que deseamos convertir en notacin JSON y devuelve una cadena de texto con el JSON producido.Podemos convertir en JSON cualquier cosa que necesitemos, como una cadena, una variable numrica, un array -normal o asociativo- y objetos con todo tipo de datos dentro. Veremos varios ejemplos que ilustrarn este proceso.$mivariable = "hola";print_r(json_encode($mivariable));Esto devuelve:"hola"Ahora convertimos un array normal:$miArray = array(1,4,6,8,3,34.8,9,43);print_r(json_encode($miArray));Que devuelve:[1,4,6,8,3,34.8,9,43]Estos ejemplos anteriores son sin duda quizs demasiado simples, pero la cosa empieza a tener sentido cuando se convierte un array asociativo en JSON, como se puede ver a continuacin.$miArray = array("manzana"=>"verde", "uva"=>"Morada", "fresa"=>"roja");print_r(json_encode($miArray));

{"manzana":"verde","uva":"Morada","fresa":"roja"}Este resultado ya tiene una forma parecida a lo que estamos acostumbrados a ver en JSON. Podramos fijarnos que la cadena que devuelve no tiene saltos de lnea e identacin de los elementos, con lo que la lectura se dificulta un poco por seres humanos. No obstante, podramos utilizar esa cadena para crear una variable Javascript y por supuesto podremos acceder a cualquier valor del JSON, de una manera parecida a esta:

JSONFrutas = eval();alert(JSONFrutas.manzana);

Como se ha visto, para almacenar el JSON en una variable Javascript, sin almacenar la propia cadena, sino el objeto que representa, tenemos que utilizar la funcin Javascript eval(). Luego podemos acceder a los componentes del JSON como lo hacemos con cualquier objeto, variable, operador punto y luego el nombre de la propiedad a acceder.3 Crear un objeto con PHP y convertirlo en JSONComo deca, lo bonito es que desde PHP podemos convertir cualquier objeto que tengamos, para generar el JSON del mismo y poder enviarlo a Javascript o cualquier otro lenguaje o componente que necesitemos que lo procese. El mecanismo es exactamente igual, con la salvedad que primero tenemos que crear una clase, instanciar un objeto y luego convertirlo a JSON con json_encode().As crearamos una clase e instaciaramos ojetos con ella.//creo una clase arbolclass NodoArbolDHTML{var $nombre;var $url;var $hijos;function __construct($nombre,$url){$this->nombre = $nombre;$this->url = $url;}function anadirHijo($nodoHijo, $nombre){//aadir un hijoif (!isset($this->hijos)){$this->hijos = array();}$this->hijos[$nombre] = $nodoHijo;}}Como se ha visto, se ha implementado una clase NodoArbolDHTML, con la que podramos crear una estructura de rbol. El rbol tiene distintos nodos y cada uno a su vez tiene un nombre, una URL y un conjunto que hijos, que tambin son nodos del rbol.Ahora, podramos instanciar objetos tipo nodo, para crear el rbol, de la siguiente manera.$raiz = new NodoArbolDHTML("Raiz", "http://www.loquesea.com");$miNodo = new NodoArbolDHTML("Mi arbolito", "http://www.oi.com");$raiz->anadirHijo($miNodo, "loquesea");$miNodo2 = new NodoArbolDHTML("Mi otro nodo", "http://www.as.com");$raiz->anadirHijo($miNodo, "otro");Con esto ya tenemos la mayor parte del trabajo creado, porque para producir el JSON simplemente tenemos que llamar a la funcin json_encode(), que ya hemos visto repetidas veces:print_r(json_encode($raiz));Con esto mostraramos en la pgina la cadena:{"nombre":"Raiz","url":"http://www.loquesea.com","hijos":{"loqesea":{"nombre":"Mi arbolito","url":"http://www.oi.com","hijos":null},"otro":{"nombre":"Mi arbolito","url":"http://www.oi.com","hijos":null}}}Nota:Las barras de "http://" estn bien escritas, aunque aparezcan como "http://", lo que pasa es que PHP se les coloca una contrabarra como caracter de escape.De nuevo la forma como se muestra la cadena no tiene muy fcil lectura, por la falta de saltos de lnea y los identados. Pero bueno, eso no es problema para Javascript, como podremos ver en el cdigo siguiente, que ilustra la manera en que podemos utilizar ese JSON para crear objetos en el cliente.

var arbolJavascript = eval();alert(arbolJavascript.hijos.loquesea.nombre);alert(arbolJavascript.hijos.otro.url);

4 Escapar caracteres especiales en cadenas JSONEn la notacin JSON se utiliza Unicode como juego de caracteres, por su universalidad. Por tanto, en Unicode hay determinados caracteres, como pueden ser la ee, letras con acentos, etc, que tienen que convertirse en sus correspondientes cdigos de escape para que todo funcione correctamente. Por ejemplo, la letra "" tiene el cdigo "u00f1". En las cadenas que utilizamos en la notacin JSON se deben colocar entonces caracteres Unicode, excepto las comillas dobles (que se utilizan para delimitar la cadena y por tanto se debe escapar) y la barra invertida, que es el carcter de escape.Afortunadamente, la funcin PHP json_encode() hace la conversin de las cadenas a Unicode automticamente, por lo que no nos deberamos preocuparnos por este detalle, sin embargo, PHP toma de manera predeterminada que la cadena de origen est en UTF-8, por lo que, si trabajamos con archivos en ISO-8859-1, tendremos que convertirlos antes a UTF-8.Por ejemplo, en mi ejemplo PHP, que tengo en mi ordenador guardado con ISO-8859-1, si intento crear un JSON de esta manera:$miArray = array("Pars"=>"Francia", "Madrid"=>"Espaa");print_r(json_encode($miArray));Obtengo la siguiente cadena:{null:"Francia","Madrid":null}Esto se soluciona, como digo, convirtiendo antes las cadenas a UTF-8, al menos las que tienen caracteres distintos del alfabeto ingls.

Con lo que obtengo la siguiente cadena codificada con JSON:{"Paru00eds":"Francia","Madrid":"Espau00f1a"}Con este artculo de desarrolloweb .com ya hemos visto cmo podemos producir cadenas con notacin JSON a partir de variables, arrays u objetos. Esperamos que haya sido instructivo y os citamos para el prximo artculo, en el que veremos cmo crear variables u objetos PHP a partir del contenido de cadenas JSON.

Veremos cmo crear objetos o variables PHP a partir de una cadena de texto con notacin JSON.PorMiguel Angel AlvarezPHP puede interpretar datos provenientes de una cadena con notacin JSON, de modo que se puedan guardar en variables y luego utilizarlas en los scripts del lado del servidor. En este articulo veremos cmo hacerlo y adems destacaremos una serie de consejos para que los JSON estn bien formados y consigamos una correcta interpretacin.Recordemos que existen diversas libreras para que podamos trabajar con cadenas en notacin JSON, que vimos en el artculo delibreras disponibles en PHP para JSON. Nosotros estamos utilizando para estos artculos de desarrolloweb.com las funciones nativas de PHP para JSON, que estn disponibles por defecto desde PHP 5.2.Primero vamos a mostrar un objeto definido con JSON mediante Javascript, para hacer unas comprobaciones y saber si est bien construido.

var objJson = {elemento1: "valor1",elemento2: 22,elemento3: null,masCosas: {voy: "ya",vengo: "despues"}}alert(objJson.elemento1)alert(objJson.masCosas.vengo)

Este script Javascript, ejecutado en un navegador, nos mostrara dos mensajes de alerta con valores que se han colocado en el objeto definido con notacin JSON. Esto no tiene nada que ver con lo que vamos a ver sobre PHP, pero al menos tenemos claro que nuestro JSON es correcto.Ahora vamos a crear una variable PHP con la cadena para hacer este objeto y lo cargaremos en una variable PHP interpretando el JSON. Para ello PHP dispone de una funcin llamada json_decode() que recibe la cadena con notacin JSON y devuelve un objeto, o cualquier otro tipo de variable, que estuviera representada en el JSON.

Ahora podramos mostrar el contenido de esa variable con la funcin de PHP print_r(), que muestra el contenido de variables de manera que se pueda entender por un humano.stdClass Object([elemento1] => valor1[elemento2] => 22[elemento3] =>[masCosas] => stdClass Object([voy] => ahora[vengo] => ya))Por ltimo podemos intentar acceder a una de las propiedades de este objeto, de esta manera:echo "Una propiedad cualquiera:" . $obj_php->elemento1;5 Consejos para hacer un JSON que se pueda interpretar correctamenteLa funcin json_decode() de PHP requiere unas normas un poco ms estrictas a la hora de construir un JSON. Si no atendemos esas reglas no obtendremos un mensaje de error, sino que la funcin devolver un valor nulo: null. Por tanto, algo que Javascript puede interpretar correctamente puede que no sea as por PHP, as que hay que prestar especial atencin sobre una serie de puntos.1) En la cadena JSON, tanto el nombre de una propiedad como el valor deben estar entre comillas, menos los valores numricos, o palabras como null, que pueden estar sin comillas.Incorrecto:$json = json_decode('{nombre: "cualquier valor"}');Correcto:$json = json_decode('{"nombre": "cualquier valor"}');2) Se tienen que utilizar comillas dobles. No se permiten comillas simples para los nombres de variables y sus valores.Incorrecto:$json = json_decode("{'frutas': ['pera', 'uva']}");Correcto:$json = json_decode('{"frutas": ["pera", "uva"]}');3) No podemos dejarnos una coma que despus no tenga nada, as como un corchete o llave de ms o de menos.Incorrecto:$json = json_decode('{"nombre": "valor", }');Correcto:$json = json_decode('{"nombre": "valor"}');4) Tenemos que enviar los datos a json_decode() en UTF-8. Si estamos trabajando en iso-8859-1, habra que codificar la cadena en UTF-8 previamente:Incorrecto:$json = json_decode('{"maana": "mircoles"}');Correcto:$json = json_decode(utf8_encode('{"maana": "mircoles"}'));

Ejercicio prctico sobre el consumo de un archivo JSON desde una pgina PHP y de trabajo con el API de Panoramio.PorMiguel Angel AlvarezJSONes un formato utilizado para el intercambio de informacin entre sistemas. Utiliza Javascript como lenguaje y sintaxis para la definicin de objetos, en archivos de texto que son transferidos fcilmente por Internet. Poco a poco se ha ido incorporando al uso habitual en el desarrollo web por su facilidad de uso y su integracin en lenguajes de programacin habituales, como PHP. En este artculo vamos a presentar una prctica con JSON en PHP basada en el uso del API de Panoramio.Panoramio es un popular servicio de Google, como probablemente sabremos, que permite subir imgenes localizadas geogrficamente en losmapas de Google. Panoramio dispone de un API para la integracin de las fotografas de su base de datos en otras aplicaciones web, de manera que cualquier persona puede presentar fotos de lugares del mundo subidas por los usuarios de Panoramio, en su propio sitio web.El API de Panoramio utiliza JSON como formato de intercambio de la informacin de las fotos. Por medio de este API podemos construir URL, que solicitadas al sitio de Panoramio, nos devuelven un JSON con los datos de las fotografas, es decir, su ttulo, autor, URL del archivo grfico, etc. Gracias a la integracin de JSON en la mayora de los lenguajes de programacin de aplicaciones web, desde casi todas las plataformas de programacin para el desarrollo, se pueden obtener fcilmente las fotos y presentarlas en un sitio web.Como venimos explicando en elManual de Trabajo con JSON en PHP, este lenguaje de programacin dispone de varias funciones que sirven para consumir archivos JSON y convertirlos en objetos PHP con los que podemos trabajar. Podemos ver como es de prctico el JSON al utilizar el API de Panoramio y cmo en pocas lneas de cdigo podemos acceder a Panoramio y consultar su base de datos de fotografas y mostrarlas en nuestra pgina web.Referencia:En DesarrolloWeb.com hemos publicado anteriormente un artculo para aprender a consumir JSON del API de Panoramio con el lenguaje de programacin del lado del cliente JSON:API Panoramio + ejemplo de JSON con Mootools.6 Pasos del script PHP para consultar el API de PanoramioPara crear un programa en PHP que consulte el API de Panoramio tenemos que realizar varios pasos:1. Conectar con una URL de Panoramio, enviando los datos sobre la localizacin desde donde queremos obtener fotos, para recibir un JSON con los datos de dichas fotos.2. Procesar el JSON, para obtener un objeto PHP con los datos de las fotografas.3. Hacer un bucle para recorrer las fotografas del objeto, para mostrar las fotografas obtenidas en nuestra pgina.Todos estos pasos son sencillos, pero necesitaremos alguna idea sobre distintas partes de PHP, pero afortunadamente en Desarrollo web .com tenemos artculos para obtener la base de conocimientos necesaria para realizar cualquiera de estos pasos.7 Conectar con una URL de Panoramio:Esto lo tenemos que hacer con lasfunciones de trabajo con archivos de texto que dispone PHP, pues la lectura de ficheros se hace con las mismas funciones que la lectura de URLs, tal como explicamos en el artculoLeer ficheros con PHP.Primero tenemos que crear una URL para la consulta en el API de Panoramio, que tendr una forma como esta:http://www.panoramio.com/map/get_panoramas.php?order=popularity&set=full&from=0&to=5&minx=-0.35&miny=39.44&maxx=-0.34&maxy=39.46&size=mediumEsto nos devolvera fotos: por orden de popularidad, desde la foto encontrada en posicin 0 hasta la posicin 5 de ese ranking por popularidad, entre unas coordenadas (minx, miny) y (maxx, maxy), o lo que es lo mismo (mnima longitud y latitud) y (mxima longitud y latitud), de tamao medioLas fotos estn indicadas, como se deca, en texto con cdigo Javascript en formato JSON. As pues, si accedemos a esa URL obtendremos el JSON de respuesta.Para obtener el texto que devuelve Panoramio al acceder a esa URL tenemos que leerlo con las funciones de archivos. Utilizaremos una funcin ya explicada en el artculoLeer ficheros con PHPfunction leer_contenido_completo($url){$fichero_url = fopen ($url, "r");$texto = "";while ($trozo = fgets($fichero_url, 1024)){$texto .= $trozo;}return $texto;}As pues, con una llamada a esta funcin, enviando la URL que deseamos consultar, podramos obtener el JSON con las fotos.$URL_API_PANORAMIO = "http://www.panoramio.com/map/get_panoramas.php?order=popularity&set=full&from=0&to=5&minx=-0.35&miny=39.44&maxx=-0.34&maxy=39.46&size=medium";

$contenido_url = leer_contenido_completo($URL_API_PANORAMIO);8 Procesar el JSON:Como ya vimos en el artculoConsumir un JSON desde PHP, PHP dispone de la funcin json_decode() que devuelve un objeto PHP resultante de procesar el JSON enviado como un string por parmetro. En nuestro ejemplo podramos hacer lo siguiente:$JSON_PANORAMIO_PHP = json_decode($contenido_url);En la variable $JSON_PANORAMIO_PHP tendremos el objeto PHP resultante de la decodificacin del JSON recibido en el contenido de la URL.9 Hacer un bucle para recorrer las fotografas del objetoAhora nos queda el paso ms sencillo para los que ya tienen cierta experiencia con PHP, hacer un recorrido de todas las fotos que hayamos recibido. Ese recorrido deber tener en cuenta el formato del objeto que se recibe en el JSON. Ese objeto tiene los siguientes atributos: count (con el nmero de fotos encontradas en todo panoramio entre las coordenadas dadas, que no tiene por qu corresponder con el subconjunto de fotos recibidas. photos (que es un array con todas las fotos recibidas. Cada foto es otro objeto, que tiene los datos de esa foto en particular) has_more (con un boleano que indica si hay o no otras fotos disponibles para este punto)Nota:En realidad podemos obtener la informacin completa sobre el formato de este objeto en la propiadocumentacin del API de Panoramio.

Entonces nuestro bucle PHP tiene que hacer un recorrido al array de fotografas que hay en el atributo "photos" del objeto PHP. Podra tener esta forma:for ($i=0; $iphotos); $i++){$foto_actual = $JSON_PANORAMIO_PHP->photos[$i];echo "";echo "";echo "
";echo "" . $foto_actual->photo_title . ", por " . $foto_actual->owner_name . "";echo "";}Este recorrido se podra haber hecho de otra forma, pero nos sirve perfectamente un bucle for. Adems, quizs vosotros colocarais las fotos con otro estilo, para adaptarlas al diseo de vuestra pgina.Si se desea, podemosver las fotos de Panoramio que hay en esa localizacin, que corresponde con la Ciudad de las Ciencias y las Artes de Valencia.10 Cdigo PHP completoA continuacin para una referencia ms completa, podemos ver el cdigo completo de la pgina PHP que hemos creado para hacer este ejemplo de trabajo con JSON en PHP.

Consumir JSON del API de Panoramio desde PHP