¿Qué es JSON?
Según Wikipedia “JSON, acrónimo de «JavaScript Object Notation», es un formato ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML.”, mientras que json.org lo define como “JSON (JavaScript Object Notation – Notación de Objetos de JavaScript) es un formato ligero de intercambio de datos. Leerlo y escribirlo es simple para humanos, mientras que para las máquinas es simple interpretarlo y generarlo.” Lo cual no nos aclara la mayoría de dudas si deseamos entenderlo a fondo.
En realidad JSON no es más que una forma de estructurar texto, de manera que JavaScript pueda intercambiar información con otros lenguajes como ASP, C#, JAVA o Ruby entre muchos otros, pero en nuestro caso nos interesa PHP.
La especificación de JSON no es especialmente complicada, y solo debemos notar algunos pequeños detalles:
- Todo dato o conjunto de datos, se encierra dentro de llaves ‘
{}‘. - Cada dato se representa como un par ordenado separado por dos puntos, es decir
{"color":"rojo"}, donde ‘color‘ es el nombre del dato y ‘rojo‘ es su valor. - Un arreglo, donde cada valor recibe un indice auto-numérico, se encierra dentro de corchetes ‘
[]‘. Por ejemplo{"colores":{["rojo","verde","azul"]}}representa un arreglo llamado ‘colores’ con tres valores, que no se representaron como par ordenado, sino que se asumen de manera automática los índices 0, 1 y 2.
Veamos un ejemplo:
$persona = array (
'nombre' => 'Juan',
'apellido' => 'Pérez',
'edad' => '25',
'preferencias' => array (
'deporte' => 'Fútbol',
'comida' => 'Pizza',
'musica' => array('Rock','Jazz','Techno')
);
);
…codificado en JSON, equivale a un objeto JavaScript definido como:
var persona = {
"nombre":"Juan",
"apellido":"Pérez",
"edad":"25",
"preferencias":{
"deporte":"Fútbol",
"comida":"Pizza",
"musica":{["Rock","Jazz","Techno"]}
}
}
Lo cual no sólo es fácil de entender para quien ya utiliza objetos en JavaScript, sino que además es un conjunto de datos que ya esta listo para utilizarse. Por ejemplo podemos mostrar el nombre de forma sencilla con alert(persona.nombre); Ahora bien, la transferencia de datos puede hacerse mediante XML:
<persona>
<nombre>Juan</nombre>
<apellido>Pérez</apellido>
<edad>25</Edad>
<preferencias>
<deporte>Fútbol</deporte>
<comida>Pizza</comida>
<musica>
<0>Rock</0>
<1>Jazz</1>
<2>Techno</2>
</musica>
</preferencias>
</persona>
…pero en realidad, para convertirlo de PHP a XML necesita un procedimiento relativamente largo (unas cuantas líneas) más las que necesitamos en JavaScript para leerlo. Nuestro arreglo en PHP, se puede convertir a JSON con la simple instrucción json_encode (sólo a partir de PHP 5.2):
echo json_encode($persona);
Ahora, llevemos todo esto a la práctica. Para ello, nos ambientaremos con un sencillo formulario en nuestro archivo index.php:
<h2>Editar los datos de:</h2>
<ul>
<li><a href="#" id="empleado_2">Juan Pérez</a></li>
<li><a href="#" id="empleado_5">Pedro Ramirez</a></li>
<li><a href="#" id="empleado_9">María González</a></li>
</ul>
<form action="">
<fieldset>
<legend>Modificar información del empleado</legend>
<dl>
<dt>Nombres:</dt></pre>
<dd><input type="text" id="nombres" value="" /></dd>
<dt>Apellidos:</dt>
<dd><input type="text" id="apellidos" value="" /></dd>
<dt>Edad:</dt>
<dd><input type="text" id="edad" value="" /></dd>
<dt>preferencias:</dt>
<dd>
<ol>
<li><input type="checkbox" class="pref" id="pref_0" value="football"/> Fútbol</li>
<li><input type="checkbox" class="pref" id="pref_1" value="baseball" /> Beisbol</li>
<li><input type="checkbox" class="pref" id="pref_2" value="volleyball" /> Volíbol</li>
<li><input type="checkbox" class="pref" id="pref_3" value="chess" /> Ajedrez</li>
<li><input type="checkbox" class="pref" id="pref_4" value="painting" /> Pintura</li>
<li><input type="checkbox" class="pref" id="pref_5" value="poetry" /> Poesía</li>
</ol>
</dd>
<dt></dt>
<dd><input type="submit" value="Enviar" /></dd>
</dl>
</fieldset>
</form>
Tres links y un formulario bastan para ilustrar la manera de transferir datos de PHP a JavaScript utilizando JSON. Como se intuye, al hacer clic sobre el nombre de un empleado, el AJAX deberá traer y colocar los datos de esa persona en el formulario. El código PHP tampoco difiere mucho del que utilizamos en el ejemplo anterior, y lo colocamos en otro archivo llamado database.php:
$empleados = array(
'2' => array(
'nombres' => 'Juan Antonio',
'apellidos' => 'Pérez Sánchez',
'edad' => '25',
'preferencias' => array('0','3','4')
),
'5' => array(
'nombres' => 'Pedro Ricardo',
'apellidos' => 'Ramirez Tobar',
'edad' => '28',
'preferencias' => array('0','1')
),
'9' => array(
'nombres' => 'Juan Antonio',
'apellidos' => 'Pérez Sánchez',
'edad' => '25',
'preferencias' => array('2','4','5')
)
);
$emp = $_POST['emp'];
echo json_encode($empleados[$emp]);
De nuevo encontramos un caso donde los datos deberían venir de una base de datos, pero para simplicidad del ejemplo, utilizaremos un arreglo bastante pequeño. El valor recibido por medio de $_POST, es seleccionado en el arreglo e impreso en forma de JSON. Asumiendo que el usuario seleccionó al empleado Juan Pérez, la respuesta JSON sería:
{
"nombres":"Juan Antonio",
"apellidos":"Pérez Sánchez",
"edad":"25",
"preferencias":["0","3","4"]
}
HTML sencillo y un PHP simple, nos hacen deducir que es el jQuery el que hace todo el trabajo, así que nuevamente recurrimos a ver el código primero y luego a explicarlo:
$(document).ready(function(){
$('.empleados').click(function(){
$('.pref').each(function(){
$(this).removeAttr('checked');
});
var empleado = (this.id).split('_').pop();
$.post('database.php', { emp: empleado}, function(datos){
$('#nombres').val(datos.nombres);
$('#apellidos').val(datos.apellidos);
$('#edad').val(datos.edad);
$(datos.preferencias).each(function(){
$('#pref_'+this).attr('checked', 'checked');
});
},'json');
return false;
});
});
Como ya es costumbre, explicaremos línea por línea cómo funciona este script:
- El código solo podrá entrar en acción cuando el documentu haya sido cargado por completo.
- Luego, establecemos que el script solo se activará al hacer clic sobre cualquier elemento con la clase empleados (en nuestro caso, cualquiera de los tres enlaces).
- Antes de hacer el AJAX, es necesario “limpiar” cada checkbox. Por ello utilizamos el ciclo
.each()que básicamente ejecuta una o más instrucciones por cada objeto existente. En este caso, adjuntamos el ciclo a los objetos con clase pref, es decir, nuestros checkbox. - Entonces, a cada uno de los checkbox, le removemos el atributo checked (lo tengan o no), y de esa manera ninguno queda marcado.
- Fin del ciclo
.each()abierto en la línea 3. - ¿Cómo sabemos cual es el empleado seleccionado? Pues tomamos el atributo id del enlace que estamos trabajando. Recordemos que estamos bajo el supuesto que el usuario hizo clic sobre el nombre de Juan pérez y por lo tanto el valor de dicho atributo sera “empleado_2″. Ese valor lo separamos en partes mediante split(), utilizando como criterio de separación, el guión mayor (_) y con pop(), tomamos la última de esas partes, que es el número 2. Este valor queda almacenado en la variable empleado.
- Iniciamos con el AJAX al igual que el ejemplo anterior, enviando al documento
database.php, el valor de la variable empleado bajo el nombre emp y recibiendo la respuesta en la variable datos del callback. - Al input con id=”nombres”, le cambiamos el atributo value con .val(). Ahora bien, el valor que asignamos es un miembro del objeto JS que fue devuelto via JSON y almacenado en la variable datos. Por lo tanto si queremos acceder a uno de sus miembros, se hace por medio de un punto después de la variable, seguido del identificador de ese miembro: datos.nombres según nuestro ejemplo.
- Repetimos el procedimiento con el input que tiene id=”apellidos”.
- Y lo mismo para el input con id=”edad”.
- El último miembro del objeto, es un arreglo con tres valores (0, 3 y 4 para Juan Pérez). Para recorrerlo, usamos nuevamente el ciclo
.each()y así, accedemos a cada uno de sus valores de forma individual. - Ahora, utilizando cada uno de esos valores podemos construir las cadenas ‘#pref_0′, ‘#pref_3′ y ‘#pref_4′, para agregar el atributo checked=”checked” a los checkbox correspondientes.
- Fin del ciclo
.each()abierto en la línea 11. - Cerramos, el
$.post(), no sin antes especificar el tipo de respuesta que esteramos recibir vía AJAX. Si no especificamos este parámetro, el tipo predeterminado sera tipo texto (que puede incluir html), pero también podemos indicar que la respuesta será ‘json’ o ‘xml’. - Aún nos encontramos dentro de las acciones a realizar al hacer clic sobre un enlace, y de manera predeterminada al activar un vínculo, el navegador intentará dirigirse a la dirección descrita en el atributo href=”". Como en AJAX no necesitamos ninguna redirección, evitamos esto con la instrucción return false; que le indica al navegador que debe hacer caso omiso de la activación del enlace.
- Cerramos las acciones a realizar al hacer clic sobre el vínculo.
- Finalizamos el script.
Una vez terminado, podemos observar que el manejo del JSON por parte de el jQuery no es nada complicado. Lo que se necesita es comprender como funcionan los objetos en JavaScript.


#1 by PESTEVEZ on 17/Nov/2009
Está bastane claro tu tutorial, felicidades, pero fijate que no lo pude correr, ya que al bajar el ejemplo, en el archivo .zip no viene el archivo style.css, será que puedes enviármelo, felicitaciones
#2 by Gabo on 14/Ene/2010
Buen tutorial! Congrats!! Jaja me resolvió mi duda de que es JSon =P
#3 by orlando on 21/Ene/2010
tengo una duda, digamos que la respuesta que me mande el codigo php lo quiera guardar en variables y no en textbox, los recupero pero al momento de llamarlas fuera de esa funcion $.post(… no me reconoce la variable que le asigne de la respuesta del php, una ayuda como haria para recuperar ese valor de mi variable.
saludos
#4 by Attakinsky on 21/Ene/2010
El objeto que recobe la respuesta es de por si una variable, pero es una tipo objeto.
En el ejemplo de este artículo, datos.edad almacena de por sí uno de los datos que nos devuelve PHP. Si aún así querés almacenarlo en otra variable podes hacerlo como:
var mi_edad = datos.edad;
pero en verdad eso sería redundante pues tendrías el mismo valor en dos variables diferentes.
#5 by chepe263 on 8/Feb/2010
segun estaba travesiando con unas funciones, es importante que declares la variable antes del post si quieres hacer esto
Var contenido;
$.post(‘http://urlfalsa.como’,{propiedad:valor},function(data){
contenido=data;
});
contenido.propiedad // has algo aqui
Supongo seria bastante util si quieres almacenar alguna especie de dato que sera recurrente como el nombre del usuario o algo asi
#6 by orlando on 23/Ene/2010
bueno eso lo entiendo lo que yo quiero hacer es algo como:
$.post(‘controllers/acceso.php’,{ code:codigo},function(datos){
var respuesta=datos;
},’json’);
alert(“respuesta: “+respuesta);
pero no me recupera la variable ‘respuesta’
probe declarando la variable fuera del $.post( pero ni aun asi me lo recupera
#7 by Attakinsky on 25/Ene/2010
Primero, el alert, deberia ir adentro del function del $.post:
$.post(’controllers/acceso.php’,{ code:codigo},function(datos){
var respuesta=datos;
alert(”respuesta: “+respuesta);
},’json’);
Acordate que AJAX es ‘asynchronous’ y por lo tanto no realiza TODO en el orden q vos penses que lo debe hacerlo.
Segundo: confirma por URL que el PHP si esta haciendo lo que se supone que deba hacer. Te recomiendo que utilicés Firebug para analizar lo que el AJAX está haciendo.
#8 by orlando on 25/Ene/2010
ok gracias por la explicacion lo testeare con firebug
#9 by chepe263 on 25/Ene/2010
Hey, haciendo de cuenta que uso CURL y me trae los datos json, pero en un array php. Si quiero convertirlos a JSON de nuevo uso json_encode()
Como manejo los datos si, por ejemplo, en el script uso un print_r. Como data.text o algo asi o el formato de regreso tiene que decirle al $.post() que es un json talvez usando Header(‘Content-type’) o algo asi
#10 by Attakinsky on 25/Ene/2010
El formato “especial” por llamarlo de alguna manera es JSON y para eso usás json_encode().
Según la documentacion oficial en http://docs.jquery.com/Post los únicos formatos posibles son: “xml”, “html”, “script”, “json”, “jsonp” y “text”.
Donde un script se refiere a un javascript. El xml o el html q devolvás lo construís con print_r o más bonito con echo y sin especificar mayor cosa. Al fin y al cabo son texto. Por ejemplo:
echo “<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML…. bla bla bla”;
#11 by chepe263 on 27/Ene/2010
sip! En conclusion, es recomendable especificar el formato que te devuelve. Una cosa que me estaba fijando es que olvide ‘contarle’ a jquery que era json.
Gracias por la ayuda Attakinsky (por poco olvido la N)
#12 by marseaplage on 31/May/2010
Hola quisiera saber como instalo json para que me corra el ejemplo, en el .zip no viene el json.php
#13 by Attakinsky on 1/Jun/2010
No hay ningún archivo llamado “json.php”. Si quieres usar JSON, solo necesitas jQuery y un archivo PHP (cualquiera) que reciba la petición. Si tu version de PHP es 5.1 o inferior, entonces para utilizar JSON necesitas esta función: http://rod.gs/yac
#14 by Isabelita on 26/Jun/2010
Uyyy, que cosas raras tengo, descargué FIREFOX , versión 3.6.4 , la última. En una cosa que pone consola de errores me da FLAGFOX ACTIONS LOADED FROM JSON PREF, parece mi baile favorito
. Leí que parece del JAVA , o algo así, no se mucho, me pueden ayudar ?. besitos a tos.
#15 by Attakinsky on 26/Jun/2010
Flagfox es un plugin para Firefox, que por lo que tu me cuentas intuyo que debe trabajar mediante JSON para algo.
Pero no es algo que tu puedas cambiar a menos que sepas como se crean esos plugins. Si no te funciona desactivalo por un tiempo, seguro en pocos días lo arreglaran para que funcione bien con las nuevas versiones del navegador.
#16 by Isabelita on 27/Jun/2010
Gracias Attakinsky , pues verás, saber , saber , me temo que poco, los plugins, sé que los hay buenos y malos, y JSON, me suena al malo de la película. Miraré como se desactiva Mister JSON ,
. Le quedo muy agradecida, besos. Que bueno que haya personas que intentan ayudar. Pues no sé si trabajo para algo. Igual es que tengo dos navegadores , el Mozilla e Internet 8, los dos
con el google . Es un poco tarde decirlo pero creo que vale.
#17 by Raúl Expósito on 19/Jul/2010
Muchas gracias, me ha sido muy útil para simular unas llamadas a un backend que de momento no tengo.
Saludos
#18 by Chemiagu on 2/Ago/2010
Está tan claro que se me puso todo oscuro, yo programaba en basic , te has esplayado en poner creo que en Java la programación. No sé nada de Java, antes me iba mejór sin errores en el Mozilla firefox. Pone consola de errores y salen cosas , no admitido , tal y cual, limpio y siempre lo mismo. Yo creo que los que dicen que bueno, o muy claro, no se han enterado de la peca a la mesa. Saludos. Cls:key off : Inpunt ” cuantos datos ? ” : For a=1 to datos: Print a: Next . El mundo avanza nosotros queremos pararlo …
#19 by Attakinsky on 2/Ago/2010
Si yo antes de programar en PHP lo hacía en VB6. Solo te aclaro que JAVA y JavaScript no son lo mismo. Lo que explico aca es sobre el segundo lenguaje que no es más que un script ejecutado del lado del cliente. Igual el viejo BASIC donde numerabas tus líneas de 10 en 10 o de 5 en 5 también lo conocí y aún me trae buenos recuerdos.