Creación y consumo de JSON con PHP

Al momento de crear una página o aplicación web la optimización de recursos es un aspecto fundamental, principalmente cuando se trabaja con Web Services.

Normalmente un Web Service usa el estándar XML para el intercambio de información el cual está basado en etiquetas haciendo que la información enviada y recibida tenga un peso mayor.

Aquí es donde entra JSON (JavaScript Object Notation), el cual es una manera de serializar la información haciéndola más ligera y que PHP puede manejar sin problema desde la versión 5.2.1.

Prácticamente cualquier objeto en PHP puede convertirse a JSON, siendo los arrays asociativos quienes aprovechan mejor esta característica:

$miArreglo = array("pera"=>"verde", "manzana"=>"roja", "naranja"=>"naranja");
$cadenaJSON = json_encode($miArreglo);
// El valor de $cadenaJSON sería: {"pera":"verde","manzana":"roja","naranja":"naranja"}

Es importante la codificación de los caracteres, si estamos trabajando con UTF-8, podemos usar la función utf8_encode() antes de la conversión a JSON:

$miArreglo = array("deporte"=>utf8_encode("fútbol soccer"), "instrumento"=>utf8_encode("balón"));
$cadenaJSON = json_encode($miArreglo);

Ya sabemos crear una cadena de texto en formato JSON, ahora vamos a consumirla.

Si con json_encode() convertimos un objeto a JSON, con json_decode() lo volvemos a convertir a objeto:

$json = '{
	"pera":"verde",
	"manzana":"roja",
	"naranja":"naranja"
}';

$objeto = json_decode($json);

Al imprimir la variable $objeto con la function print_r() obtendremos:

stdClass Object (
	[pera] => verde
	[manzana] => roja
	[naranja] => naranja
)

// Si quiero mostrar algún valor:
echo $objeto=>pera; // el resultado será: verde

Si queremos convertirlo a un array asociativo, agregamos true como segundo parámetro en json_decode:

$objeto = json_decode($json, true);

// para mostrar un valor del arreglo:
echo $objeto['pera']; // el resultado será: verde

Consumo de JSON desde una URL externa

Actualmente los Web Services son producidos también en formato JSON para aligerar el peso de la información. Si queremos consumirlos desde PHP, sólo necesitamos la dirección URL y usar la función file_get_contents():

$url = 'http://daimonikos.com/demo/books.json';
$books = json_decode(file_get_contents($url), true);

Al estar convirtiendo el Web Service a un array asociativo, podemos recorrer cada registro con la función foreach():

foreach($books as $b){
	echo $b['name'].'<br>';
}

/* El resultado sería:
The Lightning Thief
The Sea of Monsters
Sophie's World : The Greek Philosophers
Lucene in Action, Second Edition
*/

Por último, si queremos validar que una cadena JSON esté correctamente formateada, podemos usar la página jsonlint.com para validarlo.