24 - De JSON a PHP (utilizando la librería JSON.php)


Ahora nos queda ver como en el servidor recibir datos con formato JSON y proceder a generar una clase en PHP mediante la librería JSON.php.

La sintaxis es:

$json=new Services_JSON();
$cad=$json->decode(stripslashes($_REQUEST['cadena']));
echo 'Nombre:'.$cad->nombre;
...
...

Es decir la clase Services_JSON tiene un método llamado decode que recibe como parámetro una cadena con datos codificados en JSON y procede a retornar la información en un objeto.

Confeccionaremos un problema que envíe desde el navegador información en formato JSON y en el servidor la convertiremos en un objeto de PHP y procederemos a generar un trozo de HTML que retornaremos al navegador para que lo muestre.

El archivo pagina1.html

<html>
<head>
<title>Problema</title>
<script src="../json.js" language="JavaScript"></script>
<script src="funciones.js" language="JavaScript"></script>
</head>
<body>
<h2>Enviar datos desde el navegador en formato JSON y proceder a la
decodificación en una clase PHP con la librería JSON.php</h2>
<input type="button" value="Enviar" id="boton1">
<div id="resultados"></div>
</body>
</html> 

El archivo con las funciones JavaScript es:

addEvent(window,'load',inicializarEventos,false);

function inicializarEventos()
{
  var ref=document.getElementById('boton1');
  addEvent(ref,'click',botonPresionado,false);
}

function botonPresionado(e)
{
  var obj={
    nombre:'juan',
    edad:25,
    sueldos:[1200,1700,1990]
  };
  var cadena=obj.toJSONString();
  enviarDatos(cadena);
}

var conexion1;
function enviarDatos(cadena) 
{
  conexion1=crearXMLHttpRequest();
  conexion1.onreadystatechange = procesarEventos;
  conexion1.open('GET','pagina1.php?cadena='+cadena, true);
  conexion1.send(null);
}

function procesarEventos()
{
  var resultados = document.getElementById("resultados");
  if(conexion1.readyState == 4)
  {
    resultados.innerHTML = conexion1.responseText;
  } 
  else 
  {
    resultados.innerHTML = "Cargando...";
  }
}

//***************************************
//Funciones comunes a todos los problemas
//***************************************
function addEvent(elemento,nomevento,funcion,captura)
{
  if (elemento.attachEvent)
  {
    elemento.attachEvent('on'+nomevento,funcion);
    return true;
  }
  else  
    if (elemento.addEventListener)
    {
      elemento.addEventListener(nomevento,funcion,captura);
      return true;
    }
    else
      return false;
}

function crearXMLHttpRequest() 
{
  var xmlHttp=null;
  if (window.ActiveXObject) 
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  else 
    if (window.XMLHttpRequest) 
      xmlHttp = new XMLHttpRequest();
  return xmlHttp;
}

Cuando se presiona el botón procedemos a partir de un objeto JavaScript generar una cadena en formato JSON, luego procedemos a llamar a la función enviarDatos:

  var obj={
    nombre:'juan',
    edad:25,
    sueldos:[1200,1700,1990]
  };
  var cadena=obj.toJSONString();
  enviarDatos(cadena);

La función enviarDatos procede a crear un objeto de la clase XMLHttpRequest y pasa mediante el parámetro GET la cadena en formato JSON:

var conexion1;
function enviarDatos(cadena) 
{
  conexion1=crearXMLHttpRequest();
  conexion1.onreadystatechange = procesarEventos;
  conexion1.open('GET','pagina1.php?cadena='+cadena, true);
  conexion1.send(null);
}

Solo queda mostrar el trozo de datos en HTML que retorna el servidor:

function procesarEventos()
{
  var resultados = document.getElementById("resultados");
  if(conexion1.readyState == 4)
  {
    resultados.innerHTML = conexion1.responseText;
  } 
  else 
  {
    resultados.innerHTML = "Cargando...";
  }
}

Lo nuevo se centra en el archivo pagina1.php:

<?php
require('../JSON.php');
$json=new Services_JSON();
$cad=$json->decode(stripslashes($_REQUEST['cadena']));
echo 'Nombre:'.$cad->nombre;
echo '<br>';
echo 'Edad:'.$cad->edad;
echo '<br>';
echo 'Primer sueldo:'.$cad->sueldos[0];
echo '<br>';
echo 'Segundo sueldo:'.$cad->sueldos[1];
echo '<br>';
echo 'Tercer sueldo:'.$cad->sueldos[2];
?>

El método que convierte una cadena con formato JSON en un objeto de PHP es:

$cad=$json->decode(stripslashes($_REQUEST['cadena']));

Recordemos que con la función stripslashes sacamos los caracteres de escape(barras invertidad para las comillas entre otras)

Luego podemos fácilmente acceder a los atributos del objeto con la sintaxis:

echo 'Nombre:'.$cad->nombre;
echo '<br>';
echo 'Edad:'.$cad->edad;
echo '<br>';
echo 'Primer sueldo:'.$cad->sueldos[0];
echo '<br>';
echo 'Segundo sueldo:'.$cad->sueldos[1];
echo '<br>';
echo 'Tercer sueldo:'.$cad->sueldos[2];