Académique Documents
Professionnel Documents
Culture Documents
www.desarrolloweb.com
Existe un artculo muy interesante, aunque en ingls, que compara 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 cmo utilizar las funciones JSON en PHP por medio de las
funciones nativas del lenguaje.
Artculo por Miguel Angel Alvarez
Esto devuelve:
"hola"
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:
<script>
JSONFrutas = eval(<?php echo json_encode($miArray);?>);
alert(JSONFrutas.manzana);
</script>
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.
//aadir un hijo
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));
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.
<?php
$arbol_php = json_encode($raiz);
?>
<script>
var arbolJavascript = eval(<?php echo $arbol_php;?>);
alert(arbolJavascript.hijos.loquesea.nombre);
alert(arbolJavascript.hijos.otro.url);
</script>
Esto se soluciona, como digo, convirtiendo antes las cadenas a UTF-8, al menos las que tienen
caracteres distintos del alfabeto ingls.
<?php
$miArray = array(utf8_encode("Pars")=>"Francia", "Madrid"=>utf8_encode("Espaa"));
print_r(json_encode($miArray));
?>
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.
Artculo por Miguel Angel Alvarez
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.
<?php
$str_obj_json = '{
"elemento1": "valor1",
"elemento2": 22,
"elemento3": null,
"masCosas": {
"voy": "ahora",
"vengo": "ya"
}
}';
$obj_php = json_decode($str_obj_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;
Correcto:
2) Se tienen que utilizar comillas dobles. No se permiten comillas simples para los nombres de
variables y sus valores.
Incorrecto:
Correcto:
3) No podemos dejarnos una coma que despus no tenga nada, as como un corchete o llave
de ms o de menos.
Incorrecto:
Correcto:
4) Tenemos que enviar los datos a json_decode() en UTF-8. Si estamos trabajando en iso8859-1, habra que codificar la cadena en UTF-8 previamente:
Incorrecto:
Correcto:
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 medio
Las 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 artculo Leer ficheros con
PHP
function 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);
Procesar el JSON:
Como ya vimos en el artculo Consumir 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);
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 propia
documentacin del API de Panoramio.
10
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; $i<count($JSON_PANORAMIO_PHP->photos); $i++){
$foto_actual = $JSON_PANORAMIO_PHP->photos[$i];
echo "<p>";
echo "<img src='" . $foto_actual->photo_file_url . "' width='" . $foto_actual->width . "' height='" . $foto_actual>height . "'>";
echo "<br>";
echo "<small>" . $foto_actual->photo_title . ", por " . $foto_actual->owner_name . "</small>";
echo "</p>";
}
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, podemos ver las fotos de Panoramio que hay en esa localizacin, que corresponde
con la Ciudad de las Ciencias y las Artes de Valencia.
11
}
?>
</body>
</html>
12